目录
D.医生
思路:从范围来看m和k,可知我们可以将每一个字符串看成一个二进制数,将他们转换成十进制后,进行深度搜索,每种药有可选或不选两种情况,当搜到最后一种药时,我们只需将病人的十进制数与我们所选的药所组成的十进制数进行与运算,若最后结果与病人的十进制数相等,则说明我们所选的药包含病人的这些病,然后我们可以再加个剪枝,如果当前选的药数已经大于目前的最小值可以直接回溯。
Code:
cpp
int n,m,ans;
int medicine[15],people[10005],k;
void dfs(int depth,int num,int medi,int id)
{
if(num>=ans) return ;
if(depth==k+1)
{
if((medi&people[id])==people[id])
{
ans=min(ans,num);
}
return ;
}
dfs(depth+1,num+1,medi|medicine[depth],id);
dfs(depth+1,num,medi,id);
return ;
}
void solve()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
char c;cin>>c;
int x=c-'0';
if(x)
{
people[i]|=(1<<(m-j));
}
}
}
cin>>k;
for(int i=1;i<=k;i++)
{
for(int j=1;j<=m;j++)
{
char c;cin>>c;
int x=c-'0';
if(x)
{
medicine[i]|=(1<<(m-j));
}
}
}
for(int i=1;i<=n;i++)
{
ans=1e18;
dfs(1,0,0,i);
if(ans==1e18) cout<<-1<<endl;
else cout<<ans<<endl;
}
}
E.降温(easy)
思路:贪心,只有当前一项比后一项大于等于x的时候才算寒潮,所以如果要使寒潮天数最大,我们要尽可能使a[i]变大,这样a[i]-a[i+1]>=x的概率才更大,如果第一个数为-999,则a[1]=50,其他数如果a[i]!=-999,a[i-1]-a[i]>=x则寒潮天数+1,如果a[i]=-999,若a[i-1]-x>=-50,则当a[i]=a[i-1]-x时寒潮天数增加,反之a[i]=50。求最小天数也一样,我们尽可能使a[i-1]-x超过-50这个边界,即a[i]尽可能小。
Code:
cpp
constexpr int N=1005,mod=998244353;
int a[N],b[N],n,x;
void solve()
{
cin>>n>>x;
int ma=0;
for(int i=1;i<=n;i++)
{
cin>>a[i];
b[i]=a[i];
if(i==1)
{
if(a[i]==-999)
a[i]=50;
continue;
}
if(a[i]!=-999)
{
if(a[i-1]-a[i]>=x)
ma++;
}
else
{
if(a[i-1]-x>= -50)
{
ma++;
a[i]=a[i-1]-x;
}
else a[i]=50;
}
}
cout<<ma<<' ';
int mi=0;
for(int i=1;i<=n;i++)
{
if(i==1)
{
if(b[i]==-999)
b[i]=-50;
continue;
}
if(b[i]!=-999)
{
if(b[i-1]-b[i]>=x) mi++;
}
else
{
if(b[i-1]-x >= -50)
{
b[i]=b[i-1]-x+1;
}
else b[i]=-50;
}
}
cout<<mi;
}
F.降温(hard)
思路:与E题思路一样,改下数据范围即可。
Code:
cpp
constexpr int N=1e5+5,mod=1e9+7,spj=-999999999;
constexpr int minn=-5*1e8,maxn=5*1e8;
int a[N],b[N],n,x;
void solve()
{
cin>>n>>x;
int ma=0;
for(int i=1;i<=n;i++)
{
cin>>a[i];
b[i]=a[i];
if(i==1)
{
if(a[i]==spj)
{
a[i]=maxn;
}
continue;
}
if(a[i]!=spj)
{
if(a[i-1]-a[i]>=x) ma++;
}
else
{
if(a[i-1]-x>=minn)
{
a[i]=a[i-1]-x;
ma++;
}
else a[i]=maxn;
}
}
cout<<ma<<' ';
int mi=0;
for(int i=1;i<=n;i++)
{
if(i==1)
{
if(b[i]==spj)
b[i]=minn;
continue;
}
if(b[i]!=spj)
{
if(b[i-1]-b[i]>=x)
mi++;
}
else
{
if(b[i-1]-x>=minn) b[i]=b[i-1]-x+1;
else b[i]=minn;
}
}
cout<<mi;
}