ZeroJudge B158: 獎學金

題目敘述

本題採EOF方式收資料,每筆資料第一行有一個正整數N,接下來會有N行,每行有三個正整數,分別代表不同學生的語文、數學、和英文的成績。要求輸出將總分排序過後成績前5名學生的學號及總分,如果總分相同就比語文成績,如果語文成績相同學號較小的人排在前面。


範例輸入 #1

6

90 67 80

87 66 91

78 89 91

88 99 77

67 89 64

78 89 98


8

80 89 89

88 98 78

90 67 80

87 66 91

78 89 91

88 99 77

67 89 64

78 89 98

範例輸出 #1

6 265

4 264

3 258

2 244

1 237


8 265

2 264

6 264

1 258

5 258


解題思路

使用Vector<Pair<pair<int, int>>, int>>來存取資料並且使用Sort來排序,依序方入總分、語文、及學號,因為學號越小就會排到越前面,所以存學號的時候要將學號乘以-1,輸出的時候記得要將學號再乘以-1變回來。

解題程式碼如下 (僅供參考):

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

int main() {
    cin.sync_with_stdio(0);
    cin.tie(0);
    int N;
    while (cin >> N)
    {
        vector<pair<pair<int, int>, int>>v;
        for (int i = 0; i<N; i++)
        {
            int a, b, c;
            cin >> a >> b >> c;
            int total = a+b+c;
            pair<int, int>d;
            d.first = total;
            d.second = a;
            pair<pair<int, int>, int>e;
            e.first = d;
            e.second = (i+1)*(-1);
            v.push_back(e);
        }
        sort(v.begin(), v.end());
        int size = int(v.size()-1);
        for (int i = size; i>=size-4; i--)
        {
            cout << v[i].second*-1 << " " << v[i].first.first << "\n";
        }
        cout << "\n";
    }
}

留言