记一道有趣的通信题
忘了是哪个学长说过,uoj的easy round很适合训练NOIP,今天发现有一场,正准备看看题,突然看到了这句话:本次的难度和相近,欢迎大家来玩~!
不过还是看了一下第一题。我对于非传统题见得不多,但是提答题在高级考试里面已经比较普及了,交互题也在CF和AT上见过(虽然不会做),通信题却是第一次听说。
简单说一下通信题是什么:写多个程序,它们得到的输入是不一样且互相不知道的,两个程序可以互相交流,从而得到最终的答案,通信次数通常是有限制的。
这道题的题意概述:
A得到了一个长度为 2n 的数组,只含有0/1;
B得到了一个长度为 n 的数组,里面写有一些数字,表示数组下标。
现在要求输出A数组中,以B数组里的每个数作为数组下标的位置 的数。
通信要求:(m为每个人可以发信息的次数,只能发送0/1)
Part 1:n=1000,m=2000
这个部分分非常好得,只要让A用他的所有发信次数将A数组整个发给B,由B来输出即可.
Part 2:n=1000,m=1600
通过观察发现,两个人都有m次通信次数,那么B什么都不发显然是很浪费的,考虑一下让他发什么。首先可以尝试用二进制发送下标,这样A只需要把所需位置的数发过来。但是发送坐标至少要11个二进制位,所以B只能发160-个坐标,在最差情况下,这些坐标正好就是1~160,A之后还是需要将其他位置全部发送,没有节约发送量。
从这里往后都是看的题解了-----这么看来,B将自己的通信次数用来发送坐标是非常不合算的,还有别的办法吗?考虑一个简单的优化,A每发一个数,B就告诉他下一个数还需不需要发,如果不发就跳过一个,这样两者每次消耗的次数是一样的。在最差情况下,前n个数都不需要选,而全部都在后n个数中,此时A在前半段每隔一个数发一个,后半段全部发送,而B在前半段一共回答n/2次不用发,在后半段回答n次要发,,可以通过。
Part 3:n=1000,m=1350
将序列平均分成三段,此时至少有一段里有一半以上的数被选择(如果每段被选择的都不到一半,那么加起来肯定不到一半),让B把这一段的编号发给A,A把这一整段发过来。对于其他的两段,由B将坐标发过去,A只返回所需答案,此时总复杂度为
通信题真有趣...
顺带一提:月考史地政竟然都及格了,阅卷老师太良心了。
---shzr
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效