1047 编程团体赛 (20 分)
编程团体赛的规则为:每个参赛队由若干队员组成;所有队员独立比赛;参赛队的成绩为所有队员的成绩和;成绩最高的队获胜。
现给定所有队员的比赛成绩,请你编写程序找出冠军队。
输入格式:
输入第一行给出一个正整数 N(≤104),即所有参赛队员总数。随后 N 行,每行给出一位队员的成绩,格式为:
队伍编号-队员编号 成绩
,其中队伍编号
为 1 到 1000 的正整数,队员编号
为 1 到 10 的正整数,成绩
为 0 到 100 的整数。输出格式:
在一行中输出冠军队的编号和总成绩,其间以一个空格分隔。注意:题目保证冠军队是唯一的。
输入样例:
6 3-10 99 11-5 87 102-1 0 102-3 100 11-9 89 3-2 61
输出样例:
11 176
=================================================================
思路是:用map把同一队的成绩累加起来,然后输出最高分。
以下碎碎念可以跳过直接看代码。
=================================================================
我踩的坑:
我想map不是自动从小到大排序嘛,那我直接累加完,把map的最后一个输出不就完事 ?(这步就已经想错了)
可是怎么输出map的最后一个呢?它又不支持m.end()-1(只有vector和string支持迭代器+数字),后来发现搞一个迭代器出来,
map<int, int>::iterator it = m.end();
--it; //让迭代器自减就是最后一个元素,因为m.end()是最后一个元素的下一个位置,美国人喜欢左闭右开。
printf("%d %d\n", it->first, it->second);
这样不就行了?我真的naive,因为我忘了最重要的一点,map自动排序时对 key 排序,而不是对 value 排序。
所以还是乖乖遍历m,找出最大值吧~
=================================================================
小广告:
以往的刷题过程中,经常摸鱼结果一个月下来A不了几题,效率很低。为了提高积极性,搞了一个打卡群,每天在群友监督下都能刷几题,不在摸鱼!
每天刷题,共同成长。欢迎加入不是养老群的PAT打卡监督群:Q群号:937300205
#include <iostream>
#include <map>
using namespace std;
int main(){
int n, id, t, sco, max = -1, index = -1;
cin >> n;
getchar();
map<int, int> m;
for(int i = 0; i < n; i++){
scanf("%d-%d %d", &id, &t, &sco);
m[id] += sco;
}
for(auto it = m.begin(); it != m.end(); ++it){
if(it->second > max){
max = it->second;
index = it->first;
}
}
printf("%d %d\n", index, max);
return 0;
}