首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

OpenJudge 百煉習題:競賽計分系統 C++ 解法詳解

     編輯:關於C++

題目背景

三支隊伍(編號 1、2、3)輪流答題,共 n 輪。每輪每隊結果為:right(+10 分)、wrong(-10 分)、give-up(0 分)。最終按得分降序輸出排名,同分同行,編號小者靠前。

輸入輸出範例

輸入:
4
right wrong give-up
right right right
wrong right right
right right right

輸出:
(3,30) (1,20)(2,20)

解題思路

  1. 定義結構體存儲隊伍編號 Nu 與得分 All。
  2. 初始化三隊得分為 0。
  3. 讀取 n,循環 n 輪,每輪讀取 3 個字符串對應 1、2、3 號隊結果。
  4. 根據字符串更新得分:right +10,wrong -10,give-up 不變。
  5. 自定義排序規則:分高者前,分同則編號小者前。
  6. 輸出:遍歷排序後數組,同分不換行,分不同換行。

C++ 參考代碼

#include <iostream>
#include <string>
#include <algorithm>
#include <vector>
using namespace std;

struct Team {
    int id;
    int score = 0;
};

int main() {
    int n;
    if (!(cin >> n)) return 0;
    vector<Team> teams(3);
    for (int i = 0; i < 3; ++i) teams[i].id = i + 1;

    string res;
    for (int round = 0; round < n; ++round) {
        for (int i = 0; i < 3; ++i) {
            cin >> res;
            if (res == "right") teams[i].score += 10;
            else if (res == "wrong") teams[i].score -= 10;
        }
    }

    sort(teams.begin(), teams.end(), [](const Team& a, const Team& b) {
        if (a.score != b.score) return a.score > b.score;
        return a.id < b.id;
    });

    for (int i = 0; i < 3; ++i) {
        cout << "(" << teams[i].id << "," << teams[i].score << ")";
        if (i == 2 || teams[i].score != teams[i+1].score) cout << endl;
        else cout << " ";
    }
    return 0;
}

關鍵點總結

  • 使用 vector + sort + Lambda 表達式簡化排序邏輯。
  • 輸出格式控制:同分隊伍同行空格分隔,分數變化換行。
  • 注意輸入可能包含多行,用 cin >> string 自動跳過空白字符。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved