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的时候. 代码如下: # ...
随机推荐
- H5——video百花齐放(浏览器自带的播放器)
前言 手机自带浏览器的H5播放器 真是百花齐放啊(各个手机厂家有各个厂家的控件UI) 需求 手机浏览器木有控件条 自动播放 全屏处理 监控进度条 快进后退 自动播放 自动播放就给跪了 ios 安卓 为 ...
- nodejs 监控代码变动实现ftp上传
被动模式下 //https://www.npmjs.com/package/watch //文件同步功能 var watch = require('watch'); var path = requir ...
- Async 异步转同步详细流程解释
安装 npm install async --save 地址 https://github.com/caolan/async Async的内容主要分为三部分 流程控制: 简化九种常见的流程的处理 ...
- 如何将maven项目打包上传到私服
比如我们想要把项目通过maven生产源码包和文档包并发布到自己的私服上,有两个maven插件可以做到这些工作,一个是maven-source-plugin,另一个是maven-javadoc-plug ...
- 《Linux内核设计与实现》 第一、二章学习笔记
第一章 Linux内核简介 一.Unix 1.Unix的特点 简洁 绝大部分东西都被当做文件对待.这种抽象使对数据和对设备的操作都是通过一套相同的系统调用借口来进行的:open(),read(),wr ...
- 20135327郭皓--Linux内核分析第五周 扒开系统调用的三层皮(下)
Linux内核分析第五周 扒开系统调用的三层皮(下) 郭皓 原创作品转载请注明出处 <Linux内核分析>MOOC课程 http://mooc.study.163.com/course/U ...
- Docker HUB 的重要性
1. 昨天晚上和今天早上 学习了下 mysql 的 主从配置(docker化部署) ,但是发现很多 -e 的参数不清楚. 然后在docker HUB 上面发现了具体的内容. 认识到 工作学习生活中 肯 ...
- 小程序 JM
// 本地 // 'https://ly.com/' // 短信验证码参数: let dataValue = { 'type': 1, mobile: '13615814562' }; dataVal ...
- C# 多线程初级汇总
异步委托 创建线程的一种简单方式是定义一个委托,并异步调用它 委托是方法的类型安全的引用 Delegate类还支持异步地调用方法.在后台,Delegate类会创建一个执行任务的线程 投票,并检查委托是 ...
- 一本通1656Combination
1656:Combination 时间限制: 1000 ms 内存限制: 524288 KB [题目描述] 原题来自:BZOJ 2982 LMZ 有 n 个不同的基友,他每天晚上要选 ...