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;
}
posted @ 2024-02-03 23:10  21xf2257  阅读(3)  评论(0编辑  收藏  举报