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的更多相关文章

  1. Codeforces.835E.The penguin's game(交互 按位统计 二分)

    题目链接 \(Description\) 有一个长为\(n\)的序列,其中有两个元素为\(y\),其余全为\(x\).你可以进行\(19\)次询问,每次询问你给出一个下标集合,交互库会返回这些元素的异 ...

  2. 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 ...

  3. 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 ...

  4. codeforces B. Polo the Penguin and Matrix 解题报告

    题目链接:http://codeforces.com/problemset/problem/289/B 题目意思:给出一个 n 行 m 列的矩阵和数值 d .通过对矩阵里面的数进行 + d 或者 - ...

  5. 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 ...

  6. Codeforces 288E - Polo the Penguin and Lucky Numbers(数位 dp+推式子)

    题目传送门 似乎我的解法和官方题解不太一样 纪念自己独立做出来的一道难度 2800 的题. 我们记 \(ans(x)\) 为 \([444...44,x]\) 的答案,显然答案为 \(ans(r)-a ...

  7. CodeForces 288C Polo the Penguin and XOR operation (位运算,异或)

    题意:给一个数 n,让你求一个排列,使得这个排列与0-n的对应数的异或之最大. 析:既然是异或就得考虑异或的用法,然后想怎么才是最大呢,如果两个数二进制数正好互补,不就最大了么,比如,一个数是100, ...

  8. CodeForces 288B Polo the Penguin and Houses (暴力或都快速幂)

    题意:给定 n 和k,n 表示有n个房子,然后每个有一个编号,一只鹅要从一个房间中开始走,下一站就是房间的编号,现在要你求出有多少种方法编号并满足下面的要求: 1.如果从1-k房间开始走,一定能直到 ...

  9. CodeForces 288A Polo the Penguin and Strings (水题)

    题意:给定一个字符,让你用前 k 个字符把它排成 n 长度,相邻的字符不能相等,并且把字典序最小. 析:其实很简单么,我们只要多循环ab,就行,最后再把剩下的放上,要注意k为1的时候. 代码如下: # ...

随机推荐

  1. JQ_下雪特效

    这是一个jQuery下雪特效.特效的代码如下: <style>body{background:black;color:white}</style><script>/ ...

  2. 如何在unity中使用龙骨动画

    龙骨 龙骨是Egret公司的一个用来做动画的软件,本文分享一下如何在Unity2D中使用龙骨导出的2D动画 导出动画 在龙骨中文件->导出,导出动画数据和纹理到Unity的项目中,如果打包了的话 ...

  3. Shell 基础 -- 流编辑器 sed 详解

    一.流编辑器 sed 与命令 sed Linux 中,常使用流编辑器 sed 进行文本替换工作.与常使用的交互式编辑器(如vim)不同,sed 编辑器以批处理的方式来编辑文件,这比交互式编辑器快得多, ...

  4. SQL手工注入漏洞测试(Sql Server数据库)

    还是先找到注入点,然后order by找出字段数:4 通过SQL语句中and 1=2 union select 1,2,3……,n联合查询,判断显示的是哪些字段,就是原本显示标题和内容时候的查询字段. ...

  5. PAT甲题题解-1119. Pre- and Post-order Traversals (30)-(根据前序、后序求中序)

    (先说一句,题目还不错,很值得动手思考并且去实现.) 题意:根据前序遍历和后序遍历建树,输出中序遍历序列,序列可能不唯一,输出其中一个即可. 已知前序遍历和后序遍历序列,是无法确定一棵二叉树的,原因在 ...

  6. Linux内核设计与实现(chapter1/2)

    Linux内核简介 Unix从一个失败的多用户操作系统Multics中衍生来的. Unix强大的原因: 简洁 几乎所有的东西都被当做文件来对待,可以通过相同的系统调用接口来进行调用. 因为它是由c语言 ...

  7. ElasticSearch 2 (24) - 语言处理系列之停用词:性能与精度

    ElasticSearch 2 (24) - 语言处理系列之停用词:性能与精度 摘要 在信息检索早期,磁盘和内存相较我们今天的使用只是很小的一部分.将索引空间保持在一个较小的水平是至关重要的,节省每个 ...

  8. [转帖]Linux后端执行命令的方法

    Linux 后台执行命令的方法 http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=4241330&fromuid=212883 ...

  9. kafka 数据一致性-leader,follower机制与zookeeper的区别;

    我写了另一篇zookeeper选举机制的,可以参考:zookeeper 负载均衡 核心机制 包含ZAB协议(滴滴,阿里面试) 一.zookeeper 与kafka保持数据一致性的不同点: (1)zoo ...

  10. javascript 设置input 输入框里面的内容

    比如百度首页的输入框  id为kw 用javascript:document.getElementById('kw').value="杀手 博客园";用jQuery:$(" ...