牛客多校10 - Tournament(找规律)
題目鏈接:點擊查看
題目大意:現(xiàn)在有 n 個隊伍參加比賽,任意兩個隊伍之間都要進行一次比賽,也就是共需要進行 n * ( n - 1 ) / 2 次比賽,對于每個隊伍來說,必須要在第一場比賽的時候到達賽場,在最后一場比賽結束后離開賽場,在賽場上呆的時間即為貢獻,現(xiàn)在求出一種比賽的安排順序,使得每個隊伍的貢獻之和最小
題目分析:可以自己手玩一下找找規(guī)律,這里以 n = 6 為例,畫個圖:
上圖中表示了 n * ( n - 1 ) / 2 場比賽按照升序排列后,也就是按照紅色箭頭的方向依次比賽,相信肯定有不少同學在看完樣例后以為這樣是最優(yōu)的,于是莽了一發(fā),結果得到的是答案錯誤吧?
我來一步一步優(yōu)化一下整體序列,使得每次都變的最優(yōu)吧,首先求一下當前情況下,每個隊伍需要在賽場上滯留的天數(shù)
接下來我們不難發(fā)現(xiàn),如果嘗試將 ( 2 , 3 ) 這個點移到 ( 1 , 3 ) 之后,可以使得隊伍 1 的貢獻加一,隊伍 2 和隊伍 3 的貢獻不變,隊伍 4 , 5 , 6 的貢獻減一,顯然這樣是更優(yōu)的,于是我們移動一下
在此基礎上,我們發(fā)現(xiàn)前移 ( 2 , 4 ) 也是可以讓貢獻減少,于是再次更新順序
到此為止,可以得到當 n = 6 的答案序列了,是不是沒有看出任何規(guī)律?好,那我們繼續(xù)將 ( 2 , 5 ) , ( 2 , 6 ) 和 ( 3 , 4 ) 分別移動到相應的位置,看看結果會發(fā)生什么樣的變化
?
到此為止,差不多就可以稍微總結一下結論或者規(guī)律了, 首先默認初始時比賽的順序為最初的升序排列,對于一比賽不妨設為 ( i , j ) 滿足?i < j ,如果將 ( i , j ) 前移(先不要管將其移動到什么位置),則對整體的貢獻就是,i 前面的隊伍,貢獻會 +1 ,j 后面的隊伍,貢獻會 -1,用公式表達的話,( i , j ) 前移的貢獻就是 sum += ( i - 1 ) - ( n - j ) ,也就是說,對于一場比賽我們可以分為三種情況:
推廣一下發(fā)現(xiàn)這個結論對所有的 ( i , j ) 都適用,剩下的就是在三個部分中,各自排序的問題了,在上面手動模擬后,看的出中間部分和后面部分按照升序排列就好了,而前半部分需要按照 j 的升序排列,當 j 相同時再按照 i 的升序排列
證明的話我也不會,畢竟是比賽時找規(guī)律亂搞出來的,不過看完之后應該感覺還是比較有道理是吧?
實現(xiàn)就比較簡單了
代碼:
?
?
總結
以上是生活随笔為你收集整理的牛客多校10 - Tournament(找规律)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 牛客多校9 - Groundhog Ch
- 下一篇: 牛客多校10 - Decrement o