Codeforces 835E. The penguin's game
http://codeforces.com/problemset/problem/835/E
题意:
这是一道交互题
有n个数,其中有2个y,n-2个x
每次你可以询问若干个数的异或和,从而得出y的位置
最开始给出n,x,y
最多询问19次
多猪试毒问题:
有1000瓶药,其中只有1瓶是解药,其他的都是毒药
你有一些猪,今天让他们会喝下若干瓶药,所有没有喝到解药的猪会在明天的同一时刻死去
问最少需要多少头猪一定会试出哪瓶是解药
答案是10头
因为不同的数的二进制位至少有一位不相同
10位二进制可表示1000以内的所有的数
让第i头猪喝下所有第i位二进制位为1的药
如果明天第i头猪没有死,就可以确定解药的第i位二进制位为1
这道题相当于是有两瓶解药,而且如果喝下两瓶解药会变成毒药
让你构造一种喝药的方案,用至多19头猪找出解药
如果我们能想办法找到一堆药,使得这里面有且只有一瓶解药,那就可以套用上面的方法了
同样的方法,两瓶解药的二进制位至少有一位不同
如果有一头猪没有死,那么它所喝下的药里一定只有一瓶解药,它没喝的药里面也有且仅有一瓶解药
最多用10头猪就可以找到这样的一头猪
它喝的药 和 没喝的药 数量少的那一组里套用一次上面的多猪试毒的方法
就可以找到数量少的那一组 的解药的编号
这一步最多用9头猪
注意一定要用数量少的那一组,这样才能使数量至少减半,变成2^9数量级
(⊙o⊙)…,现在没有猪了,还有一瓶解药,怎么办?
回到第一步,如果有一头猪死了,代表它要么喝下了两瓶解药,要么没喝解药,说明两瓶解药的二进制位相同
如果有一头猪没死,说明两瓶解药的二进制位不同
记录下那些二进制位不同
异或上第一瓶解药的编号即可得到第二瓶解药的编号
在这道题里,
解药相当于y,
毒药相当于x,
猪喝下某些药死了相当于询问的位置异或和为 0 或者 x
猪喝下某些药没死相当于询问的位置异或和为 y 或者 x xor y
#include<cstdio>
#include<vector>
#include<cstring> using namespace std; vector<int>V,U; bool vis[]; int main()
{
int n,x,y;
scanf("%d%d%d",&n,&x,&y);
int siz;
int tmp; bool tag=false;
int bit=;
int pos;
int ans=;
for(int i=;i<=;++i)
{
V.clear();
if(!tag) memset(vis,false,sizeof(vis));
for(int j=;j<=n;++j)
if(j&(<<i)) V.push_back(j),vis[j]=true;
siz=V.size();
if(!siz) continue;
printf("? %d ",siz);
for(int j=;j<siz;++j) printf("%d ",V[j]);
printf("\n");
fflush(stdout);
scanf("%d",&tmp);
if(tmp==y || tmp==(x^y))
{
bit+=<<i;
if(!tag)
{
tag=true;
pos=i;
if(siz<n-siz) U=V,ans=<<i;
else
{
for(int j=;j<=n;++j)
if(!vis[j]) U.push_back(j);
}
}
}
}
int m=U.size();
for(int i=;i<=;++i)
{
if(pos==i) continue;
V.clear();
for(int j=;j<m;++j)
if(U[j]&(<<i)) V.push_back(U[j]);
siz=V.size();
if(!siz) continue;
printf("? %d ",siz);
for(int j=;j<siz;++j) printf("%d ",V[j]);
printf("\n");
fflush(stdout);
scanf("%d",&tmp);
if(tmp==y || tmp==(x^y)) ans+=<<i;
}
printf("! %d %d",min(ans,ans^bit),max(ans,ans^bit));
}
Codeforces 835E. The penguin's game的更多相关文章
- Codeforces.835E.The penguin's game(交互 按位统计 二分)
题目链接 \(Description\) 有一个长为\(n\)的序列,其中有两个元素为\(y\),其余全为\(x\).你可以进行\(19\)次询问,每次询问你给出一个下标集合,交互库会返回这些元素的异 ...
- Codeforces Round #427 (Div. 2) [ C. Star sky ] [ D. Palindromic characteristics ] [ E. The penguin's game ]
本来准备好好打一场的,然而无奈腹痛只能带星号参加 (我才不是怕被打爆呢!) PROBLEM C - Star sky 题 OvO http://codeforces.com/contest/835/p ...
- codeforces 288A:Polo the Penguin and Strings
Description Little penguin Polo adores strings. But most of all he adores strings of length n. One d ...
- codeforces B. Polo the Penguin and Matrix 解题报告
题目链接:http://codeforces.com/problemset/problem/289/B 题目意思:给出一个 n 行 m 列的矩阵和数值 d .通过对矩阵里面的数进行 + d 或者 - ...
- Codeforces Round #427 (Div. 2) E. The penguin's game (交互题,二进制分组)
E. The penguin's game time limit per test: 1 second memory limit per test: 256 megabytes input: stan ...
- Codeforces 288E - Polo the Penguin and Lucky Numbers(数位 dp+推式子)
题目传送门 似乎我的解法和官方题解不太一样 纪念自己独立做出来的一道难度 2800 的题. 我们记 \(ans(x)\) 为 \([444...44,x]\) 的答案,显然答案为 \(ans(r)-a ...
- CodeForces 288C Polo the Penguin and XOR operation (位运算,异或)
题意:给一个数 n,让你求一个排列,使得这个排列与0-n的对应数的异或之最大. 析:既然是异或就得考虑异或的用法,然后想怎么才是最大呢,如果两个数二进制数正好互补,不就最大了么,比如,一个数是100, ...
- CodeForces 288B Polo the Penguin and Houses (暴力或都快速幂)
题意:给定 n 和k,n 表示有n个房子,然后每个有一个编号,一只鹅要从一个房间中开始走,下一站就是房间的编号,现在要你求出有多少种方法编号并满足下面的要求: 1.如果从1-k房间开始走,一定能直到 ...
- CodeForces 288A Polo the Penguin and Strings (水题)
题意:给定一个字符,让你用前 k 个字符把它排成 n 长度,相邻的字符不能相等,并且把字典序最小. 析:其实很简单么,我们只要多循环ab,就行,最后再把剩下的放上,要注意k为1的时候. 代码如下: # ...
随机推荐
- JavaScript快速入门-ECMAScript语句
JavaScript语句(if.for.for in.do...while.while.break.continue.switch) 一.if语句 if (condition) statement1 ...
- EVA索赔系统JAVA拦截例外站点
控制面板->JAVA->JAVA控制面板->安全->添加以下例外站点: https://aftersales.i.daimler.com https://swdist.afte ...
- Jmeter(四)_16个逻辑控制器详解
循环控制器: 指定其子节点运行的次数,可以使用具体的数值,也可以设置为变量 1:勾选永远:表示一直循环下去 2:如果同时设置了线程组的循环次数和循环控制器的循环次数,那循环控制器的子节点运行的次数为两 ...
- POW的重力之美
定律一:每一个UTXO都保持其状不变,直到有外力迫使它改变这种状态为止--艾萨克•牛顿,原理2.0 在过去的几年里,关于比特币的工作量证明(PoW)所造成的"巨大的能源浪费"已经被 ...
- Test Cases
对于mode1 1 路径下一个空文件夹 结果:生成一个空的txt 2路径下一个文件夹内包含一个txt内容为abd(最基本的一个单词) 3路径下一个空文件夹一个txt,txt内容为以不同符号 ...
- Feature List
我组最终决定所做的软件工程项目是Bing词典(UWP)的背单词模块,下面是初步定下的Feature List. 按用户场景变化顺序列举(假设是新用户): 1.用户可通过点击“背单词”标识或按钮进入背单 ...
- 这个C#程序真了不起
(1)在2~31中,这个数不能且仅不能被两个相邻数整除 (2)2 123 581 660 200 (2,3,4,5,6,7,8,9,10,11,12,13,14,15,18,19,20,21,22,2 ...
- 读C#程序最小公倍数答案就是:2123581660200
阅读下面程序,请回答如下问题: 问题1:这个程序要找的是符合什么条件的数? 问题2:这样的数存在么?符合这一条件的最小的数是什么? 问题3:在电脑上运行这一程序,你估计多长时间才能输出第一个结果?时间 ...
- [CB]Intel 2018架构日详解:新CPU&新GPU齐公布 牙膏时代有望明年结束
Intel 2018架构日详解:新CPU&新GPU齐公布 牙膏时代有望明年结束 北京时间12月12日晚,Intel在圣克拉拉举办了架构日活动.在五个小时的演讲中,Intel揭开了2021年CP ...
- Delphi Try Except 实例
//判断单位转换率 try um_rate := vp_mstr.F('vp_um_rate_d').AsFloat / vp_mstr.F('vp_um_rate_m').AsFloat; then ...