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的时候. 代码如下: # ...
随机推荐
- 让docker中的mysql启动时自动执行sql文件
本文提要 本文目的不仅仅是创建一个MySQL的镜像,而是在其基础上再实现启动过程中自动导入数据及数据库用户的权限设置,并且在新创建出来的容器里自动启动MySQL服务接受外部连接,主要是通过Docker ...
- Scala基础(1)
Scala基础语法 声明与定义: val,常量声明 val x:T(把x声明成一个类型为T的常量) x是变量的名字,T是变量的类型 v ...
- pyinstaller将python编写的打卡程序打包成exe
编写了一个简易的定时提醒下班打卡程序,python代码如下: #coding:utf-8 import time import datetime from tkMessageBox import * ...
- 现已告别五险一金?迎来社保商保时代保险INSURAUNCE
现已告别五险一金?迎来社保商保时代保险INSURAUNCE 经济工作会议提出,中国要降低社会保险费,研究精简归并"五险一金",可以说是为社保变革指明了大方向.未来,生育保险将与基本 ...
- PAT甲题题解-1002. A+B for Polynomials (25)-多项式相加
注意两点:1.系数也有可能加起来为负!!!一开始我if里面判断为>0导致有样例没过...2.如果最后所有指数的系数都为0,输出一个0即可,原本以为是输出 1 0 0.0... #include ...
- group by 和count的联合使用问题 [转]
group by 和count的联合使用问题 今天写查询语句遇到一个问题,就是用group by进行分组以后,用count统计分组以后的个数, 开始写的语句大体是: select count(m.fb ...
- 12th final 发布评价II
1.约跑App——nice!:用户界面很是赏心悦目,给人一种很放松的感觉,与App的主题很配合,同时也在本周内把同学提出的bug都很好地完善了,而且采用了摄像头进行发布,整个发布过程清晰明朗不少.把约 ...
- PAT 甲级 1105 Spiral Matrix
https://pintia.cn/problem-sets/994805342720868352/problems/994805363117768704 This time your job is ...
- Linux学习之CentOS(二)----远程登录管理工具SecureCRT的使用
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/3 ...
- BZOJ 4540 [Hnoi2016]序列 | 莫队 详细题解
传送门 BZOJ 4540 题解 --怎么说呢--本来想写线段树+矩阵乘法的-- --但是嘛--yali的机房太热了--困--写不出来-- 于是弃疗,写起了莫队.(但是我连莫队都想不出来!) 首先用单 ...