因為太菜不會寫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)以下是樸素歸併排序的瑞士輪code:else
}while(i<=mid)
while(j<=end)
for(int i=str;i<=end;i++)
}
#includeusing以下是大概是算了我去測試一下(逃 親測可以不開o2就ac的思路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
}
首先進行一遍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輪比賽,每輪比賽第一名與倒數第一比,第二名與倒數第二比,依次類推。能力值大的贏,贏的加一分,輸的不加,每次比完一輪都要動態重新整理排名。一開始,每次比完一輪我都會重新排個序,...