返回列表 發帖

2022 C-競程比賽

C-競程比賽
時間限制 1 秒 / 記憶體限制 1 G
某大學終於要舉辦競程邀請賽了。
比賽規則是先用得到的分數來排名,得分較多者勝,若有兩隊得分相同,則使用解題時間來決定名次,解題時間越少,排名越前面
在經歷過數小的廝殺後,裁判們七嘴八舌地討論各隊究竟拿到第幾名。
由於太多裁判了,所以導致吵成一團,造成裁判長深感困擾。
因此裁判長希望有個系統可以快速地知道某一個名次是哪一隊。
● 輸入說明
第一行輸入兩個整數N和Q代表總共有N個隊伍,以及總共有Q個詢問。
接下來有N行,每行皆有兩個整數Xi,Ti以及一個字串Si。
分別代表第i個隊伍的得分,該隊伍解題縮花費的時間(秒),以及該隊伍的名稱。
接下來有Q行,每行有一個整數
代表裁判想要知道排名第Ki的隊伍是哪一個。

隊伍名稱指包含英文字母
不會有兩個隊伍得分和解題時間皆相同
● 輸出說明
對於每一筆詢問,請輸出獲得該名次的隊伍名稱。
範例輸入1
3 3
10 60 AAA
30 60 BBB
20 60 CCC
1
2
3
範例輸出1
BBB
CCC
AAA

範例輸入2
5 3
50 60 AAA
50 50 BBB
30 10 CCC
10 40 DDD
20 30 EEE
1
2
3
範例輸出2
BBB
AAA
CCC
附件: 您需要登錄才可以下載或查看附件。沒有帳號?註冊
May

回復 1# may
  1. #include <bits/stdc++.h>
  2. //#include <iostream>
  3. //#include <vector>
  4. //#include <algorithm>
  5. using namespace std;

  6. struct Team {
  7.     int score, time;
  8.     string name;
  9. };

  10. // 排序規則:
  11. // 1. 依據 score 由大到小排序
  12. // 2. 若 score 相同,則依據 time 由小到大排序
  13. bool compareTeams(const Team &a, const Team &b) {
  14.     if (a.score != b.score)
  15.         return a.score > b.score; // 分數高者優先
  16.     return a.time < b.time; // 若分數相同,時間少者優先
  17. }

  18. int main() {
  19.     int N, Q;
  20.     cin >> N >> Q;

  21.     vector<Team> teams(N);

  22.     // 讀取隊伍資料
  23.     for (int i = 0; i < N; i++) {
  24.         cin >> teams[i].score >> teams[i].time >> teams[i].name;
  25.     }

  26.     // 依據題目規則排序
  27.     sort(teams.begin(), teams.end(), compareTeams);

  28.     // 讀取查詢並輸出結果
  29.     for (int i = 0; i < Q; i++) {
  30.         int rank;
  31.         cin >> rank;
  32.         cout << teams[rank - 1].name << endl; // rank 是從 1 開始的,因此索引需減 1
  33.     }

  34.     return 0;
  35. }
複製代碼
--------------------------------------
程式解析
定義 Team 結構體

存放隊伍的 score(得分)、time(解題時間)和 name(名稱)。

compareTeams 排序函式

score 越大排名越前(a.score > b.score)。

若 score 相同,則 time 越小排名越前(a.time < b.time)。

讀取輸入

使用 vector<Team> 儲存 N 隊伍資訊。

排序

sort() 根據 compareTeams 進行排序。

處理查詢

讀取 Q 筆查詢,輸出對應名次的隊伍名稱。

由於 Ki 是從 1 開始 計數的,因此需要 rank - 1 來索引 vector。

時間複雜度分析
讀取輸入:O(N)

排序:O(N log N)

查詢:O(Q)

總時間複雜度:O(N log N + Q)

這對於 N 最大為 10^5 的情況是可行的。
------------------------------------------
測資:
測試資料 00:基本測試
輸入
3 3
10 60 AAA
30 60 BBB
20 60 CCC
1
2
3
預期輸出
BBB
CCC
AAA
測試資料01:相同得分但不同解題時間
輸入
5 3
50 60 AAA
50 50 BBB
30 10 CCC
10 40 DDD
20 30 EEE
1
2
3
預期輸出
BBB
AAA
CCC
測試資料 02:所有隊伍得分皆不同
輸入
4 4
100 20 A
90 30 B
80 25 C
70 40 D
1
2
3
4
預期輸出
A
B
C
D
測試資料 03:極端邊界測試(最低與最高得分)
輸入
6 2
1000 5 X
500 10 Y
500 8 Z
100 50 W
100 60 V
10 100 U
1
6
預期輸出
X
U
測試資料04:單一隊伍,單一查詢
輸入
1 1
999 1 WINNER
1
預期輸出
WINNER
這些測試資料涵蓋 不同情境,確保程式邏輯正確,包括:

基本測試

相同得分但不同解題時間

所有得分皆不同

邊界值(最大最小得分與時間)

只有一個隊伍的情況
May

TOP

返回列表