【PAT B1047】编程团体赛 (20 分)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zxc1364787928/article/details/89193052

1047 编程团体赛 (20 分)

编程团体赛的规则为:每个参赛队由若干队员组成;所有队员独立比赛;参赛队的成绩为所有队员的成绩和;成绩最高的队获胜。

现给定所有队员的比赛成绩,请你编写程序找出冠军队。

输入格式:

输入第一行给出一个正整数 N(≤10​4​​),即所有参赛队员总数。随后 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;
}

猜你喜欢

转载自blog.csdn.net/zxc1364787928/article/details/89193052
今日推荐