本題同樣是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輪比賽,每輪比賽第一名與倒數第一比,第二名與倒數第二比,依次類推。能力值大的贏,贏的加一分,輸的不加,每次比完一輪都要動態重新整理排名。一開始,每次比完一輪我都會重新排個序,...