切換
舊版
前往
大廳
主題

ZeroJudge - b680: 百米賽道編排 解題心得

Not In My Back Yard | 2019-01-06 23:49:30 | 巴幣 0 | 人氣 400

題目連結:


題目大意:
第一列給定一正整數 N ( N ≦ 200 ,且 N 可被 8 整除),代表接下來有 N 列輸入。每列輸入有兩數字,第一個正整數代表第幾個選手,第二代表此選手的秒數成績。

輸入完後,照著成績快到慢排序。假設有 32 個人,則要分 32 ÷ 4 組。
並把成績第一分到第一組、第二分到第二組、3 → 3、4 → 4、5 → 4、6 → 3,按照12344321……的順序去分配選手的組別。

分完組後,每組的第一個人到第四跑道,第二個人到第五跑道……45362718,數字的順序就是把第幾個人分到對應的跑道。

求最後第一組、第二組……之跑道的選手分配。每列輸出第一個數字為組別,之後的八個數字為選手的編號。



範例輸入:
16
1 10.80
2 10.35
3 10.02
4 10.44
5 11.32
6 09.93
7 11.52
8 11.53
9 12.34
10 11.42
11 10.32
12 10.28
13 12.21
14 12.54
15 12.26
16 13.40



範例輸出:
1 15 10 2 6 11 5 13 16
2 9 7 4 3 12 1 8 14



解題思維:
把選手資料(編號、成績、目前組別)包成一個結構(Struct),並在輸入完後以成績排序。

排完序後,可以設定一變數 B 為 1 。並用迴圈跑過存選手資料的陣列,第一個選手就放到第 1 組,B + 1;第二個是第 2 組, B + 1 ……直到 B 大過人數的四分之一時, B + 1 的步驟改成 B - 1。直到 B = 0 ,再將 B - 1 改回 B + 1 。其中選手被分配到的組別即為 B 。

然後再對組別由小到大排序,每 8 個人一組。對於任一組而言,交換第一個人、第四個人的位置;交換第二個人、第五個人的位置;交換第一個人(現在是原本的第四個人)、第六個人的位置;交換第一個人(現在是原本的第六個人)、第七個人的位置。這樣便完成了 45362718 的跑道分配。

最後也是 8 個人一組輸出,輸出組別、輸出每個選手的編號,換行,輸出下一組……以此類推。

此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。

創作回應

相關創作

更多創作