AtCoder Beginner Contest 337 E-Bad Juice
E-Bad Juice
题目描述:有 $n$ 杯果汁,其中一杯是发霉的,喝了发霉的果汁会拉肚。
现在你不知道哪杯是发霉的,但明天你要把这些果汁因此你想去坑你的好基友,让他们喝下这些果汁。每个基友可以喝很多杯果汁,每杯果汁可以被很多基友喝。
为了得罪尽量少的人,请求出最少需要给多少基友喝果汁,并构造出一种方案。
接下来用一个字符串 $s$ 给出你的方案中每个人的窜稀情况,$1$ 代表拉肚,$0$ 代表没有拉肚。你需要据此输出发霉的果汁编号。
解法:
二进制的经典应用,每一次个人让他喝所有编号二进制表示在第 $i$ 位为 $1$ 的所有果汁, 最后根据评测机回答字符串,依次统计答案数字的二进制位,输出即可。
代码:
#include<bits/stdc++.h> using namespace std; int n,ans; char a[105]; int main(){ ios::sync_with_stdio(0); cin>>n; cout<<ceil(log2((double)n))<<endl; for(int i=0;i<ceil(log2((double)n));i++){ vector<int> v; for(int j=0;j<n;j++){ if(j&(1<<i)){ v.push_back(j); } } cout<<v.size(); for(int j=0;j<v.size();j++){ cout<<" "<<v[j]+1; } cout<<endl; } cin>>a; for(int i=0;i<ceil(log2((double)n));i++){ if(a[i]=='1'){ ans+=(1<<i); } } cout<<ans+1; return 0; }