首页 > 其他分享 >[题解]ABC337E Bad Juice

[题解]ABC337E Bad Juice

时间:2024-05-03 11:22:06浏览次数:12  
标签:卡片 Juice int 题解 朋友 Bad ABC337E

ABC337E Bad Juice

一开始的想法如下:

image

就是利用二分法,对于一个区间\([l,r]\),分成\([l,mid-1],[mid,r-1]\)两部分,各找两个朋友喝,右边还空出一个\(r\),如果前面两个朋友都没中毒,那说明\(r\)这瓶有毒。

但仔细一想,我们发现\([1,n)\)的瓶子中任意一个我们分出的区间\([l,r]\),都用去了\(r-l+1\)个朋友。比如上图中\([4,7]\)区间,就用了\(4\)个朋友。所以我们最终只是省下了\(1\)个朋友,用去了\(n-1\)个朋友。

这显然不够优,我们应该怎么分配呢?

你可能以前玩过一个猜数字的游戏:给你\(6\)张卡片,问你想的数在哪些卡片上。最终就可以猜出你想的数。

这个游戏的原理就是第\(i\)张卡片上的数字,都是二进制表示中第\(i\)为\(1\)的数字。最终你选了哪些卡片,就说明你选的数二进制表示中哪些位上是\(1\)。

我们用同样的原理,让第\(i\)个朋友去喝二进制表示中第\(i\)为是\(1\)的果汁。最终我们只需要用\(\lfloor \log_2(n-1)\rfloor+1\)个朋友。

之所以是\(n-1\),是因为我们可以把最后一瓶空出来,如果所有朋友都没中毒,说明毒就下在最后一瓶里。所以我们需要特判,如果最终结果为\(0\),则输出\(n\)。

点击查看代码
#include<bits/stdc++.h>
using namespace std;
int n;
map<int,set<int>> ma;
string s;
int main(){
	cin>>n;
	int m=__lg(n-1)+1;
	cout<<m<<endl;
	for(int i=1;i<n;i++){
		int tmp=i;
		for(int j=1;tmp;j++){
			if(tmp&1) ma[j].insert(i);
			tmp>>=1;
		}
	}
	for(auto i:ma){
		cout<<i.second.size()<<" ";
		for(auto j:i.second) cout<<j<<" ";
		cout<<endl;
	}
	cin>>s;
	s=' '+s;
	int ans=0;
	for(int i=m;i>=1;i--){
		ans<<=1;
		if(s[i]=='1') ans|=1;
	}
	cout<<(ans==0?n:ans)<<endl;
	return 0;
}

标签:卡片,Juice,int,题解,朋友,Bad,ABC337E
From: https://www.cnblogs.com/Sinktank/p/18170976

相关文章

  • 题解:CF607E Cross Sum
    Problem给定\(N\)条不平行的直线\(y=\frac{k_i}{1000}x+\frac{b_i}{1000}\),\(N\)条直线总共会有\(\frac{N(N-1)}{2}\)个交点(包含在同一个位置的点,即相同位置算不同的点),找出距离原点前\(K\)近的交点的距离和。$2\leN\le5\times10^4$,\(1\leK\le\frac{N(N-1)}{2}\)......
  • P6123 [NEERC2016] Hard Refactoring 题解
    本题说白了,就是一道big模拟!!!题意不再赘述,我们直接看思路。这里作者借鉴了某差分思想:末尾加空格,用于判断最后一个条件;若只有\(\le\),对给出的数字和数组第一个进行标记。标记的时候要+32769,因为数组中不存在负数下标,以免越界;若只有\(\ge\),就标记给出的数字和数组最后......
  • 5.2考试题解
    T1[NOIP2017提高组]时间复杂度大模拟……#include<bits/stdc++.h>#definelllonglongusingnamespacestd;intt,n,k,as,nw,tr,ed[105];intc[26],str[105],b[105];stringtim;stack<int>st;structAadd{strings,t,fr,ed;}ad[105];intdfs(intx){i......
  • P4921 题解
    linkHint:错排计数。\(ans_k=C_n^k\timesA_n^k\times2^k\timesg(n-k)\)\(g(i)\)代表\(i\)对情侣全部错开的方案数。解释一下\(ans_k\)的表达。我们从\(n\)对情侣中无序地抽出\(k\)对情侣,有序地放到\(k\)排座位上,这里的方案数是\(C_n^k\timesA_n^k\)。由于两个......
  • 解决vscode连接远程服务器出现Bad owner or permissions on C:\\Users\\Administr
    1.找到.ssh文件夹。它通常位于C:\Users2.右键单击.ssh文件夹,然后单击“属性”,选择“安全”3.单击“高级”。单击“禁用继承”,单击“确定”。将出现警告弹出窗口。单击“从此对象中删除所有继承的权限”。4.此时所有用户都将被删除。添加所有者。在同一窗口中,单击“编辑”按......
  • UVA1362 Exploring Pyramids 题解
    题目传送门前置知识欧拉序|区间DP|乘法原理解法DFS序可近似理解为欧拉序,故考虑区间DP。设\(f_{l,r}\)表示\([l,r]\)对应的二叉树的个数,状态转移方程为\(f_{l,r}=\begin{cases}1&l=r\\[s_{l}=s_{r}]\times\sum\limits_{i=l+2}^{r}[s_{l}=s_{i}]\timesf_{......
  • Educational Codeforces Round 165 (Rated for Div. 2) C. Minimizing the Sum题解
    题意CodeforcesRound809(Div.2)D1.ChoppingCarrots(EasyVersion)给你两个整数\(n(1\len\le3e5),k(0\lek\le10)\),一个数组\(a(1\lea_i\le10^9)\)。你可以进行如下操作最多\(k\)次:选定一个数\(i(1\lei\len)\),让其变为相邻的数(变为\(a_{i-1},a_{i......
  • P1017 [NOIP2000 提高组] 进制转换 题解
    题目简述给定一个十进制数$n$,将其转换成一个$-R$进制数。题目分析十进制数转负进制,同样可以使用短除取余法,但是会出现余数为负的情况,例如$-11\div-2=5~\cdots\cdots-1$,此时我们可以用如下法方解决此问题:我们设被除数为$a$,除数为$b$,余数为$c$,商为$d$,其中$c<0$......
  • P2192 HXY玩卡片 题解
    题目简述给定一些$5$和$0$的数字,让你在其中选择一些数进行排列成为一个非负整数,使得这个数字能被$90$整除,且是所有满足条件的数中最大的一个,无解输出$-1$。题目分析如果一个数能被$90$整除,那么它一定能被$9$和$10$整除。能被$10$整除,那就说面答案的个位数一定......
  • [题解]P4597 序列 sequence
    P4597序列sequence是CF13CSequence的加强版,\(N\leq5*10^5\)。如果想了解\(O(N^2)\)的DP解法请看此文。给定\(N\)个数,每次操作可以选其中一个数\(+1\)或\(-1\)。请问要让这个数列不降,最少需要多少次操作?看到数据范围发现不能用\(O(N^2)\)的dp了,需要换一种思路。我们用类......