Codeforces Round 761 (Div. 2) D2. Too Many Impostors (hard version)(交互+构造 最小次数)

题目

n(6<=n<1e4,n是3的倍数)个人,其中k个人是好人,n-k个人是坏人

k是未知的,但保证1/3n<k<2/3n,你可以询问若干次,

每次你可以选择三个不同的人a,b,c,系统告诉你这三个人中好人更多还是坏人更多,

其中好人更多返回1,坏人更多返回0

easy:可以询问不超过2n次

hard:可以询问不超过n+6次

要求在给定询问次数内,回答出k的值

实际t(t<=100)组样例,保证sumn不超过2e4

思路来源

乱搞ac

题解

其实是两年前做的题了,当时没写题解,现在补一下

首先n是3的倍数,恰分成n/3堆,每堆询问一次

其中约束条件1/3n<k<2/3n,是保证这n/3次询问,不会出现答案全是0或全是1的情况

记录得到一个0的询问位置(huai,huai+1,huai+2)和得到一个1的询问位置(hao,hao+1,hao+2)

得到这六个位置后,每个询问中取出四个,这里是:

令a[1]=huai,a[2]=huai+1,a[3]=huai+2,a[4]=hao,a[5]=hao+1,a[6]=hao+2,

这里是取出a[2]、a[3]、a[5]、a[6]

然后再询问四次,即C(4,3)挑一下,

b[1]询问2、3、5,b[2]询问2、3、6,b[3]询问3,5,6,b[4]询问2、5、6

注意到a[1]-a[3]的询问结果是0,说明a[2]和a[3]要么一好一坏,要么两坏,

同理,a[5]和a[6]要么一好一坏,要么两好,即a[5]和a[6]至少有一个好

那么对于235(b[1])和236(b[2])这两次询问,

即,如果把a[1]替换成a[5]/a[6]导致出现了1,出现了翻转,

而a[2]和a[3]两坏情况是翻转不过来的,说明a[2]和a[3]只能是一好一坏,那么a[1]一定是坏

如果没出现翻转,由于a[5]和a[6]一好一坏,其中好的那次都没翻转,说明a[2]和a[3]只能是两坏

这样就能获得一定是坏的人的编号了,记为huai

类似地,对于b[3]和b[4]也这么讨论一下,也能获得一定是好的人的编号,记为hao

此时用了n/3+4次询问

easy:由于得到了一好一坏,对于n个位置,每次询问(hao,huai,i),即可得出i是哪一边

总询问次数n/3+4+n,不超过2n

hard:根据之前询问的n/3次结果,在原来的结果基础上分类讨论,还是考虑这n/3堆,

(1)如果这一堆是hao或huai所在的堆,

那么有四个这样的位置未确认答案,暴力询问(hao,huai,i)即可

(2)如果之前这堆是huai,取出其中两个询问,不妨取出i和i+1,

询问(hao,i,i+1),如果答案是hao,说明i+2一定是huai,而i和i+1中一好一坏,

再暴力询问(hao,huai,i),得到这一个的值,即可得到另一个的值

(3)如果之前这堆是hao,和(2)对称,也能两次询问出这三个位置的值

所以,总的询问次数为n/3+4+n/3*2,即n+4次,符合条件

代码

#include<bits/stdc++.h>
using namespace std;
const int N=1e4+10;
int T,n;
int hao,huai,res[N];
vector<int>ans;
int one,two,a[7],b[5];
int ask(int a,int b,int c){printf("? %d %d %d\n",a,b,c);fflush(stdout);int v;scanf("%d",&v);return v;
}
void solve(){if(b[1] || b[2])huai=a[1];//被01翻了,说明a[2]和a[3]一个0一个1,a[1]是0else huai=a[2];//01都翻不过来,说明a[2]和a[3]都是0if(!b[3] || !b[4])hao=a[4];//被01翻了,说明a[5]和a[6]一个0一个1,a[4]是1else hao=a[5];//01都翻不过来,说明a[5]和a[6]都是1ans.clear();ans.push_back(huai);for(int i=1;i<=n;i+=3){if(i==one || i==two){for(int j=i;j<i+3;++j){if(j==huai || j==hao)continue;int v=ask(huai,hao,j);if(v==0)ans.push_back(j);}continue;}int x,y;if(res[i]==0){x=ask(i,i+1,hao);if(x==0){ans.push_back(i);ans.push_back(i+1);y=ask(i+2,hao,huai);if(y==0)ans.push_back(i+2);}else{ans.push_back(i+2);y=ask(i+1,huai,hao);if(y==1)ans.push_back(i);else ans.push_back(i+1);}}else{x=ask(i,i+1,huai);if(x==1){y=ask(i+2,hao,huai);if(y==0)ans.push_back(i+2);}else{y=ask(i+1,huai,hao);if(y==1)ans.push_back(i);else ans.push_back(i+1);}}}printf("! ");printf("%d",(int)ans.size());for(auto &v:ans){printf(" %d",v);}puts("");fflush(stdout);
}
int main(){scanf("%d",&T);while(T--){scanf("%d",&n);one=two=-1;for(int i=1;i<=n;i+=3){int v=ask(i,i+1,i+2);res[i]=v;if(v==0 && one==-1)one=i;if(v==1 && two==-1)two=i;}a[1]=one;a[2]=one+1;a[3]=one+2;a[4]=two;a[5]=two+1;a[6]=two+2;b[1]=ask(a[2],a[3],a[5]);b[2]=ask(a[2],a[3],a[6]);b[3]=ask(a[3],a[5],a[6]);b[4]=ask(a[2],a[5],a[6]);solve();}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/607372.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Linux进程】查看进程fork创建进程

目录 前言 1. 查看进程 2. 通过系统调用创建进程-fork初识 总结 前言 你有没有想过在使用Linux操作系统时&#xff0c;后台运行的程序是如何管理的&#xff1f;在Linux中&#xff0c;进程是一个非常重要的概念。本文将介绍如何查看当前运行的进程&#xff0c;并且讨论如何使用…

将项目同时提交到GitHub和码云Gitee上面,GitHub与Gitee同步

多个远程仓库同时使用 新建GitHub仓库 创建成功 在终端中创建仓库 如果你想在本地机器上创建Git仓库&#xff0c;或者想添加一个文件夹或文件到已经存在的Git仓库中&#xff0c;你应该在终端中创建你的Git仓库。在你可以通过终端来创建一个Git仓库。以下是在终端中创建Git仓…

java解析json复杂数据的第三种思路

文章目录 一、概述二、数据预览1. 接口json数据2. json转xml数据 三、代码实现1. pom.xml2. 核心代码3. 运行结果 四、源码传送 一、概述 接上篇 java解析json复杂数据的两种思路 我们已经通过解析返回json字符串得到数据,现在改变思路, 按照如下流程获取数据: #mermaid-svg-k…

AcrelCloud-3000环保用电监管云平台解决方案——安科瑞赵嘉敏

概述 国家全面推进打赢蓝天保卫战&#xff0c;打好碧水保卫战&#xff0c;打胜净土保卫战&#xff0c;加快生态环境保护、建设美丽中国。环保用电监管系统针对企业内的环保设施、设备运行状况进行检测&#xff0c;发挥环保设备的作用&#xff0c;提高监察效率&#xff0c;并为…

洛谷 P1217 [USACO1.5] 回文质数 Prime Palindromes 刷题笔记

P1217 [USACO1.5] 回文质数 Prime Palindromes - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 思路 直接枚举 减枝优化判断 优化1 只有偶数才会是质数 优化2 回文数的判断次数要优于检查素数 先判断是否为回文数再检查是否为质数 if( hw(i)&&isprime(i)) 这里…

工业基础类IFC—开源库汇总

ifc 基础解析库 支持语言 和授权协议&#xff01; namedescriplicenseAdapyAdapy是一个用于结构分析和设计的python库&#xff0c;致力于IFC与各种有限元格式的交互。同时&#xff0c;它还提供一套CAD模型和FEM网格模型的参数化建模框架。GPL-3.0bcfpluginbcfplugin 是一个用…

Springcloud Gateway网关

简介 SpringCloud Gateway是基于WebFlux框架实现的&#xff0c;而WebFlux框架底层则使用了高性能的Reactor模式通信框架Netty。 Spring Cloud Gateway的目标提供统一的路由方式且基于 Filter链的方式提供了网关基本的功能&#xff0c;例如:安全&#xff0c;监控/指标&#xf…

Python的工作日判断库(含调休)——chinese_calendar

chinese_calendar 库使用场景 chinese_calendar 库主要用于处理中国农历和节假日相关的日期计算和判断。以下是一些常见的使用场景&#xff1a; 判断日期是否为工作日&#xff1a;chinese_calendar 提供了 is_workday() 函数&#xff0c;可以判断指定日期是否为工作日&#xf…

lv14 IO模型:阻塞和非阻塞 7

1 五种IO模型------读写外设数据的方式 阻塞: 不能操作就睡觉 非阻塞&#xff1a;不能操作就返回错误(通过轮询即才能实现阻塞的情况 &#xff09; 多路复用&#xff1a;委托中介监控 信号驱动&#xff1a;让内核如果能操作时发信号&#xff0c;在信号处理函数中操作 异步IO&a…

ES6(一部分)未完...

文章目录 ES61.ES6 let声明变量2.ES6 const声明常量3.变量解构赋值3-1解构对象3-2解构数组3-3字符串解构 4.模板字符串5.字符串扩展5-1 include函数5-2 repeat函数&#xff08;重复&#xff09; 6.数值扩展6-1二进制和八进制表示法6-2isFinite 与 isNaN方法6-3islnteger方法6-4…

Vue3+TS+Vite 构建自动导入开发环境

关注⬆️⬆️⬆️⬆️ 专栏后期更新更多前端内容 在一个使用 Vue 3、Vite 和 TypeScript 的项目中,配置 unplugin-auto-import 和 unplugin-vue-components 插件可以极大地提高开发效率,因为它们可以自动导入 Vue 相关的 API 和 Vue 组件,从而减少了手动导入的需要。 文章目…

FPGA UDP协议栈:基于88E1111,支持RGMII、GMII、SGMII三种模式,提供3套工程源码和技术支持

目录 1、前言免责声明 2、相关方案推荐我这里已有的以太网方案本协议栈的 1G-UDP版本本协议栈的 10G-UDP版本本协议栈的 25G-UDP版本1G 千兆网 TCP-->服务器 方案1G 千兆网 TCP-->客户端 方案10G 万兆网 TCP-->服务器客户端 方案 3、该UDP协议栈性能4、详细设计方案设…

SQL常用时间处理函数总结

求两个日期的差值 datediff函数 该函数用来得到两个日期之间的差值&#xff0c;用法如下&#xff1a; datediff(expr1,expr2)当expr1大于expr2时&#xff0c;返回dif1的结果为正数&#xff0c;反之返回dif2的结果为负数. timestampdiff 该函数也是用来得到两个日期之间的差…

Hyperledger Fabric 消息协议

Fabric 中大量采用了 gRPC 消息在不同组件之间进行通信交互&#xff0c;主要包括如下几种情况&#xff1a;客户端访问 Peer 节点&#xff0c;客户端和 Peer 节点访问排序节点&#xff0c;链码容器与 Peer 节点交互&#xff0c;以及多个 Peer 节点之间的 Gossip 交互。 消息结构…

JavaScript中的Date对象和Math对象

Date对象 当我们在JavaScript中需要处理日期和时间时&#xff0c;可以使用内置的Date对象。Date对象提供了一些方法和属性&#xff0c;可以方便地获取、设置和操作日期和时间。 要创建一个Date对象&#xff0c;可以使用new Date()构造函数&#xff0c;并且可以传递参数来指定…

Android 架构 - 模块化

参考文章 谷歌官方指南 一、概念 将大型、复杂问题拆解成一个个小的、简单问题&#xff0c;从而可以做到各个击破。模块化简单讲就是把多功能高耦合的代码逻辑拆散成多个功能单一职责明确的模块。模块指 Android 项目中的 module&#xff0c;通常会包含 Gradle 构建脚本、源代…

前端 PM(Project Manager) 分享

个人经验分享 PM PM( Project Manager ) PM( Product Manager ) 一、什么情况下需要前端担任 PM&#xff1f; 在我之前遇到的项目中&#xff0c;大多数项目的 PM 是由后端/产品经理担任&#xff0c;但也有不少项目的 PM 是由前端担任&#xff0c;一般是按照以下这几种情况划…

【Android Studio】创建第一个APP工程及生成APK安装包

&#x1f31f;博主领域&#xff1a;嵌入式领域&人工智能&软件开发 前言&#xff1a;本文详细介绍创建Android Studio第一个APP工程及打包生成APK安装包。 如下两个博客我记录了第一次创建项目时出现的问题&#xff0c;若你也遇见了同样的问题&#xff0c;可参考&#…

QT上位机开发(会员充值软件)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 所有的控件当中&#xff0c;除了label、edit、radio、combobox和button之外&#xff0c;另外一个用的比较多的控件就是grid&#xff0c;也可称之为…

数学的雨伞下:理解世界的乐趣

这本书没有一个公式&#xff0c;却讲透了数学的本质&#xff01; 《数学的雨伞下&#xff1a;理解世界的乐趣》。一本足以刷新观念的好书&#xff0c;从超市到对数再到相对论&#xff0c;娓娓道来。对于思维空间也给出了一个更容易理解的角度。 作者&#xff1a;米卡埃尔•洛奈…