記一道有趣的通訊題
忘了是哪個學長說過,uoj的easy round很適合訓練NOIP,今天發現有一場,正準備看看題,突然看到了這句話:本次$UER$的難度和$NOI$相近,歡迎大家來玩~!
不過還是看了一下第一題。我對於非傳統題見得不多,但是提答題在高階考試裡面已經比較普及了,互動題也在CF和AT上見過(雖然不會做),通訊題卻是第一次聽說。
簡單說一下通訊題是什麼:寫多個程式,它們得到的輸入是不一樣且互相不知道的,兩個程式可以互相交流,從而得到最終的答案,通訊次數通常是有限制的。
這道題的題意概述:
A得到了一個長度為 2n 的陣列,只含有0/1;
現在要求輸出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次要發,$\frac{3}{2}n<m$,可以通過。
Part 3:n=1000,m=1350
將序列平均分成三段,此時至少有一段裡有一半以上的數被選擇(如果每段被選擇的都不到一半,那麼加起來肯定不到一半),讓B把這一段的編號發給A,A把這一整段發過來。對於其他的兩段,由B將座標發過去,A只返回所需答案,此時總複雜度為$\frac{4}{3}n$
通訊題真有趣...
順帶一提:月考史地政竟然都及格了,閱卷老師太良心了。
---shzr