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的时候. 代码如下: # ...
随机推荐
- java实现基于关键字的文件夹(文件)的搜索、文件夹(文件)的复制、删除
最近在做一个项目,需要实现这几项功能,上网查了很多资料,自己研究了好几天终于实现了,现在与大家分享一下. 一.JAVA实现文件夹的搜索 在百度搜索N个技术文章,从哪些大牛们共享的资料中终于写出了我 ...
- harbor使用和管理
一.上传本地镜像到harbor中 先在harbor 中创建testdocker 项目 因为我们本地没有镜像,我们先拉取一个镜像,然后进行下面的操作 查看nginx 镜像 2.下载nginx镜像到本地 ...
- [Latex] 所有字体embedded: Type3 PDF文档处理 / True Type转换为Type 1
目录: [正文] Adobe Acrobat打印解决字体嵌入问题 [Appendix I] Type3转TRUE Type/Type 1 [Appendix II] TRUE Type转Type 1 ...
- Python对Selenium调用浏览器进行封装包括启用无头浏览器,及对应的浏览器配置文件
""" 获取浏览器 打开本地浏览器 打开远程浏览器 关闭浏览器 打开网址 最大化 最小化 标题 url 刷新 Python对Selenium封装浏览器调用 ------b ...
- C++基础知识(3)
C++内置的数据类型:基本类型.复合类型 基本类型:整型,浮点型,字符型 复合类型:数组,字符串,指针和结构 复合数据类型是在基本数据类型的基础上创建的 要知道系统中整数的最大长度,可以在程序中使用C ...
- 猎豹CEO傅盛:95%的人碌碌无为,只是不懂这一点!
我一直在思索,怎么才能让一家公司更快地成长?一个人怎么才能从一群人的竞争当中脱颖而出? 1. 人的四种认知状态 最近我看了一幅图,我在其上加了一个数字注脚. 这是一个人认知的四种状态——“不知道自 ...
- 一日游 + 进度psp
假设我们全班同学及教师去吉林省吉林市1日游,请为这次活动给出规格说明书. 目录 1 引言 1.1 编写目的 1.2 项目背景 1.3 参考资料 2 需求分析 2.1 交通方式 ...
- Linux用户管理简介
Linux用户管理是Linux的优良特性之一,本文说明了Linux中用户的登录过程和登录用户的类型. 一.Linux用户登录过程 用户要使用Linux系统,必须先进行登录.Linux的登录过程和win ...
- [转帖知乎]5G 网络和 4G 网络有什么区别?
5G 网络和 4G 网络有什么区别? 先放上一篇有史以来最强的5G科普: 一个简单且神奇的公式 今天的故事,从一个公式开始讲起. 这是一个既简单又神奇的公式.说它简单,是因为它一共只有3个字母.而说它 ...
- [转帖]SSL/TLS/WTLS原理
SSL/TLS/WTLS原理 作者:yawl < yawl@nsfocus.com >主页:http://www.nsfocus.com日期:2001-02-19 一 前言 首先要澄清一下 ...