洛谷P1309 瑞士輪

2021-09-26 19:13:55 字數 1803 閱讀 3113

本題同樣是noip普及組第三題。

因為太久沒有做過題目了,先從普及組開始練習吧。

題目內容

很顯然想到的思路就是模擬,**如下:

#include

#include

#include

#include

using

namespace std;

struct player};

bool

cmp(player a,player b)

else

}int

main

(void

)for

(int i =

0;i<

2*n;i++

)sort

(player.

begin()

,player.

end(

),cmp)

;//按初始成績排序

for(

int i=

0;i)//r輪比賽

else

}sort

(player.

begin()

,player.

end(

),cmp);}

cout<.id

}

只有60分,有4個點超時了。

分析一下演算法,因為要對r輪比賽的n次比較都進行計算,再進行一次快排,所以時間複雜度大約為o(r(n+nlogn))這個量級。其中n最大可以取到105

10^5

105,r=50,單純計算不會超過5×1

08

5\times 10^8

5×10

8,接近109

10^9

109,在常數稍微大一點的時候確實有超時的可能。

顯然可以發現,快排是毫無必要的,因為分數的變動最多隻會導致鄰近順位的變化。

題解中有個思路很好,兩者相比,勝者入隊a,負者入隊b,再將ab兩隊歸併。顯然,歸併的時間複雜度為o(n),略微優於快排的o(nlogn)

#include

#include

#include

#include

using

namespace std;

struct player

else

}bool

operator

>

(const player& player)

const

else

} player&

operator=(

const player& player)};

bool

cmp(player a,player b)

else

}int

main

(void

)for

(int i =

0;i<

2*n;i++

)sort

(player.

begin()

,player.

end(

),cmp)

;//按初始成績排序

for(

int i=

0;i)//r輪比賽

else

}//歸併

int k=

0,k1=

0,k2=0;

while

(k1else

}while

(k1while

(k2} cout<.id

}

洛谷p1309 瑞士輪

因為太菜不會寫p1310 表示式的值,就只能過來水兩篇部落格啦qwq 另外這個題我是開o2才過的 雖然是寫了歸併排序 可能我太菜寫的歸併不是還可以 剪枝 吧qwq 哎,果真還是太菜啦qwq 所以準備寫歸併然後去題解學習正確的不用開o2就可以過的演算法 瑞士輪 題目鏈結 其實這個題打眼一看可以直接so...

洛谷 P1309 瑞士輪

在雙人對決的競技性比賽,如桌球 羽毛球 西洋棋中,最常見的賽制是淘汰賽和迴圈賽。前者的特點是比賽場數少,每場都緊張刺激,但偶然性較高。後者的特點是較為公平,偶然性較低,但比賽過程往往十分冗長。本題中介紹的瑞士輪賽制,因最早使用於1895年在瑞士舉辦的西洋棋比賽而得名。它可以看作是淘汰賽與迴圈賽的折中...

洛谷 p1309 瑞士輪

題意 有很多選手,選手一開始有編號,初始積分和能力值,編號按輸入順序決定,輸入完成後按積分排名,積分相同編號小的在前 規定比r輪比賽,每輪比賽第一名與倒數第一比,第二名與倒數第二比,依次類推。能力值大的贏,贏的加一分,輸的不加,每次比完一輪都要動態重新整理排名。一開始,每次比完一輪我都會重新排個序,...