洛谷p1309 瑞士輪

2022-02-19 21:30:51 字數 1491 閱讀 3324

因為太菜不會寫p1310 表示式的值,就只能過來水兩篇部落格啦qwq

另外這個題我是開o2才過的(雖然是寫了歸併排序)(可能我太菜寫的歸併不是還可以「剪枝」吧qwq)哎,果真還是太菜啦qwq

所以準備寫歸併然後去題解學習正確的不用開o2就可以過的演算法;

瑞士輪【題目鏈結】

其實這個題打眼一看可以直接sort來做,但是這個題用sort還是太慢了qwq、開o2都只有70pts,因此這是逼著我重新複習一遍歸併排序啊qwq:

about歸併:

注意歸併排序要開乙個輔助陣列f[k],k從1開始~n記錄了排好序的陣列,然後為了保證每次排序都有效所以最後要重新將f陣列的值賦給a陣列,歸併排序的思想是把乙個排序區間分成兩個大概等長(因為會出現奇數個元素所以並不是一定完全等長)的區間,然後接著再分,直到每個區間都只剩乙個元素,接下來合併兩個區間,分別設指標i和j指向要合併的兩個區間的頭,然後進行比較,如果a[i]mid或j>end(排序的末端點),然後將i之後和j之後沒有進行比較的數(因為歸併是從最小區間(1)開始排序,因此當我們排乙個區間長度時,它的左邊部分和右邊部分已經都是有序的啦)複製到f陣列中。

code:(歸併)

void msort(int str,int end)

else

}while(i<=mid)

while(j<=end)

for(int i=str;i<=end;i++)

}

以下是樸素歸併排序的瑞士輪code:

#includeusing

namespace

std;

intn,r,q;

struct

nodep[

200010],r1[200010

];bool

cmp(node x,node y)

void msort(int str,int end)

else

}while(i<=mid)

while(j<=end)

for(int i=str;i<=end;i++)

}int

main()

msort(

1,2*n);

}cout

}

以下是大概是算了我去測試一下(逃 親測可以不開o2就ac的思路

首先進行一遍sort,然後優化在於這裡的思路只需要進行一次歸併排序:

將比賽的輸贏分別記錄在乙個陣列中,贏的人記錄在一起(win),輸的人記錄在一起(lose),並記錄人數。因為一次比賽最多對每個人的成績更改1,因此整個序列的順序的波動(尤其當序列很長的時候)不會特別大,這樣我們需要排序的資料就少了。對於每次比賽後,我們進行一次優化的歸併排序:

以下附鏈結吧(咱也不能投人家的**是吧,但是咱也不想寫自己的**)

關於瑞士輪(p1309)以及引申出來的種種問題

end-

洛谷P1309 瑞士輪

本題同樣是noip普及組第三題。因為太久沒有做過題目了,先從普及組開始練習吧。題目內容 很顯然想到的思路就是模擬,如下 include include include include using namespace std struct player bool cmp player a,player...

洛谷 P1309 瑞士輪

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

洛谷 p1309 瑞士輪

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