首页 > 其他分享 >ABC337 E Bad Juice 题解

ABC337 E Bad Juice 题解

时间:2024-01-21 14:55:07浏览次数:30  
标签:Juice int 题解 ABC337 二进制 Bad 果汁

Question

ABC337 E Bad Juice

交互题

\(n\) 瓶果汁中有 \(1\) 瓶是坏的,现在需要把这些果汁分给 \(m\) 个人,每个人可以喝任意瓶,然后通过 \(m\) 个人的回复判断哪一瓶是坏的

需要输出最小的 \(m\) 以及坏果汁的编号

Solution

\(m\) 返回的结果由 \(01\) 构成,自然而然想到二进制,考虑 \(m\) 位二进制最多表示 \(2^m\) 个数字,所以一个数字对应一种情况,也就是最多能表示 \(2^m\) 种情况,所以最小的 \(m = \log_2(n-1)+1\)

然后考虑一一对应的情况,显然,用二进制直接对应编号就好了

特别的把 000... 的情况对应 \(n\) ,之后就把二进制数对应编号,具体的如果 \(x\) 的第 \(j\) 位为 \(1\) ,就说明第 \(j\) 个人需要喝第 \(x\) 瓶果汁

最后的答案求解其实很简单,只需要对 \(1\) 的人所喝的果汁取交集就好了

Code

#include<bits/stdc++.h>
using namespace std;
int main(){
    int n;
    cin>>n;
    int m=0;
    while((1<<m) < n) m++;
    cout<<m<<endl;
    vector<vector<int> > p(m+1,vector<int>());
    vector<int> vis(n+1,1);
    for(int i=1;i<n;i++){
        int x = i;
        for(int j=1;j<=m;j++)
            if((x>>(j-1))&1) p[j].push_back(i);
    }
    for(int i=1;i<=m;i++){
        cout<<p[i].size()<<" ";
        for(int j=0;j<p[i].size();j++)
            cout<<p[i][j]<<" ";
        cout<<endl;
    }
    char ch;
    for(int i=1;i<=m;i++){
        cin>>ch;
        if(ch == '0'){
            for(int j=0;j<p[i].size();j++)
                vis[p[i][j]] = 0;
        }
    }
    int ans = -1;
    for(int i=1;i<n;i++)
        if(vis[i]) ans = i;
    if(ans == -1) cout<<n<<endl;
    else cout<<ans<<endl;
    return 0;
}

标签:Juice,int,题解,ABC337,二进制,Bad,果汁
From: https://www.cnblogs.com/martian148/p/17977869

相关文章

  • ABC337 D Cheating Gomoku Narabe 题解
    QuestionABC337DCheatingGomokuNarabe给出一个\(H\timesW\)的矩阵,由o,x,.组成,一次操作为把一个.变成o,问需要最少多少次操作使得横着或竖着有连续的\(K\)个oSolution先来考虑只有一行的情况,我们定义一个长度为\(K\)的"窗口",假设需要把这个"窗口"里面的所有......
  • CF526F Pudding Monsters 题解
    题目链接:CF或者洛谷析合树真是连续段问题的降智神器先看下题目的一些特殊性,每行每列恰好有一个棋子。考虑特殊性,\(n\timesn\)的棋盘,那么就该判断是否有\(n\)个棋子,容易观察到,也就是相当于每一行并且每一列都有一个棋子。而容易知道,这些棋子所在的行或者列拿出来应当是“......
  • P4148 简单题 题解
    QuestionP4148简单题有一个\(n\timesn\)的棋盘,每个格子内有一个整数,初始时全部为\(0\),现在需要维护两种操作1xy将格子\(x,y\)里的数字加上\(A\)2x1y1x2y2输出\(x_1,y_1,x_2,y_2\)这个矩形内的数字和强制在线Solution因为强制在线,没法用CDQ什么乱搞,这......
  • P4747 [CERC2017] Intrinsic Interval 题解
    题目链接:IntrinsicInterval讲讲析合树如何解决这种问题,其实这题很接近析合树的板题的应用。增量法进行析合树建树时,需要用ST表预处理出\(max\)和\(min\)以便\(O(1)\)查询极差,然后线段树去维护\([l,r]\)上的极差减区间端点做差即\(diff-(r-l)\),当这玩意等于\(0\)时......
  • P8112 [Cnoi2021] 符文破译 题解
    题目传送门思路先看数据范围,我们发现两个字符串的长度最大会达到\(5\times10^7\)。这立刻打消了我用暴力的想法。于是,我选择了用KMP模式匹配,这一个能够在线性时间内判定字符串\(A\)是否是字符串\(B\)的字串,并求出字符串\(A\)在字符串\(B\)中各次出现的位置。如......
  • HDU2966 In case of failure 题解
    QuestionHDU2966Incaseoffailure给出平面上\(n\)个点坐标,求每个点最近的点的欧几里得距离的平方Solution算是一道K-D树的板子题维度\(K=2\)建立\(K-D\)树,在每一层更新当前最小答案\(now\_ans\),如果在然后继续遍历当前维度下距离\(\le\)的区块随机数据时间复......
  • 题解 P6226 [BalticOI 2019 Day1] 潜艇
    【洛谷博客】题解P6226[BalticOI2019Day1]潜艇题意很清楚,忽略。分析看到这种字符串题很容易想到直接广度优先搜索,复杂度\(O(rc4^m)\)。很显然承受不了,所以考虑DP。状态设计设\(f_{i,x,y}\)表示执行完前\(i\)个操作后位置\((x,y)\)能否作为终点。设命令字符......
  • 题解 [ABC321D] Set Menu
    【洛谷博客】题意给定一个长度为\(N\)的正整数数列\(A\),和一个长度为\(M\)的正整数数列\(B\),还有一个正整数\(P\)。你需要求:\[\sum\limits^{N}_{i=1}\sum\limits^{M}_{j=1}\min(A_i+B_j,P)\]分析说实话感觉这题比C还要简单。先考虑单个\(A_i\)能产生的贡献,可以......
  • 题解 [ABC321C] 321-like Searcher
    【洛谷博客】题意给定一个\(k\),你需要找到第\(k\)小的满足下面条件的正整数:对于这个数的每一位,高位大于低位。分析这个数据范围仅有一个\(1\lek\),让人很不好下手。我们不妨先做一个DP,看有多少个满足这样条件的数。设\(f_{i,j}\)表示有\(i\)位,且最高位为\(j\)......
  • 题解 [ABC242D] ABC Transform
    【洛谷博客】很巧妙的一道题。题意给定一个字符串\(S\),只包含字符A,B,C。每过一个时刻,字符会发生变化:A\(\to\)BC,B\(\to\)CA,C\(\to\)AB。设\(0\)时刻为\(S_0=S\)。进行\(Q\)次询问,每次询问时刻\(t\)时,字符串\(S_t\)中第\(k\)个字符。分析为了方便处理,我这里将所......