題目敘述
本題採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";
}
}
留言
張貼留言