为了庆祝 Atcoder 上绿写一篇题解吧

· · 题解

题目链接

比较水的交互题

Solution

题目大意就是让你用最少的朋友验证出坏了的橙汁。

题目中比较关键的在于只有一杯坏掉的橙汁,所以我们可以想到用二进制来表示每一杯橙汁的编号,经过询问后再把所有喝到坏橙汁的朋友转换成二进制,就可以查询到哪一杯橙汁是坏的。

小细节

#include<bits/stdc++.h>
using namespace std;
vector<int> v[100005];
int n,lg,u=1; 
int main(){
    cin>>n;
    while(u*2<=n){
        u*=2;
        lg++;
    }
    cout<<lg+(u!=n)<<endl;//不能正好满一位,再额外加一位 
    for(int i=1;i<=n-1;i++){
        int cnt=0,x=i;
        while(x){
            x>>=1;
            cnt++;
        }//预处理这一杯橙汁的位数 
        x=i;
        for(int j=1;x;j++){
            if(x&1) v[j].push_back(i);//统计每一个人需要喝哪几杯 
            x>>=1;
        }
    }
    for(int i=1;i<=lg+(u!=n);i++){
        cout<<v[i].size();
        for(auto j:v[i]) cout<<" "<<j;
        cout<<endl;
    }
    int pos=0,ans=0;
    for(int i=1;i<=lg+(u!=n);i++){
        char c;
        cin>>c;
        int x=c-'0';
        ans+=(1<<pos)*x;//转换回杯子的编号 
        pos++;
    }
    if(ans!=0) cout<<ans<<endl;
    else cout<<n<<endl;
    return 0;
}