记一道有趣的通信题

 

打雪仗

  忘了是哪个学长说过,uoj的easy round很适合训练NOIP,今天发现有一场,正准备看看题,突然看到了这句话:本次$UER$的难度和$NOI$相近,欢迎大家来玩~!

  

  不过还是看了一下第一题。我对于非传统题见得不多,但是提答题在高级考试里面已经比较普及了,交互题也在CF和AT上见过(虽然不会做),通信题却是第一次听说。

  简单说一下通信题是什么:写多个程序,它们得到的输入是不一样且互相不知道的,两个程序可以互相交流,从而得到最终的答案,通信次数通常是有限制的。

  这道题的题意概述:

  A得到了一个长度为 2n 的数组,只含有0/1;

  B得到了一个长度为 n 的数组,里面写有一些数字,表示数组下标。

  现在要求输出A数组中,以B数组里的每个数作为数组下标的位置 的数。

  通信要求:(m为每个人可以发信息的次数,只能发送0/1)

扫描二维码关注公众号,回复: 4616087 查看本文章

​  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次要发,$\frac{3}{2}n<m$,可以通过。

​  Part 3:n=1000,m=1350

  将序列平均分成三段,此时至少有一段里有一半以上的数被选择(如果每段被选择的都不到一半,那么加起来肯定不到一半),让B把这一段的编号发给A,A把这一整段发过来。对于其他的两段,由B将坐标发过去,A只返回所需答案,此时总复杂度为$\frac{4}{3}n$

  通信题真有趣...

  顺带一提:月考史地政竟然都及格了,阅卷老师太良心了。

---shzr

猜你喜欢

转载自www.cnblogs.com/shzr/p/10163560.html