马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
目次
D.医生
E.降温(easy)
F.降温(hard)
D.医生
思绪:从范围来看m和k,可知我们可以将每一个字符串当作一个二进制数,将他们转换成十进制后,举行深度搜索,每种药有可选或不选两种环境,当搜到末了一种药时,我们只需将病人的十进制数与我们所选的药所构成的十进制数举行与运算,若末了效果与病人的十进制数相称,则阐明我们所选的药包罗病人的这些病,然后我们可以再加个剪枝,假如当前选的药数已经大于如今的最小值可以直接回溯。
Code:
- 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变大,如许a-a[i+1]>=x的概率才更大,假如第一个数为-999,则a[1]=50,其他数假如a!=-999,a[i-1]-a>=x则寒潮天数+1,假如a=-999,若a[i-1]-x>=-50,则当a=a[i-1]-x时寒潮天数增长,反之a=50。求最小天数也一样,我们尽大概使a[i-1]-x高出-50这个界限,即a尽大概小。
Code:
- 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:
- 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;
- }
复制代码
|