题目
编程团体赛的规则为:每个参赛队由若干队员组成;所有队员独立比赛;参赛队的成绩为所有队员的成绩和;成绩最高的队获胜。现给定所有队员的比赛成绩,请你编写程序找出冠军队。
输入格式:
输入第一行给出一个正整数 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
分析
- 根据题给数据范围,本题数据类型选择int
- 根据输入格式要求,选择C语言作为输入比较方便(整个程序仍然使用C++编写)
- 每个队员的信息可以使用struct或class保存,包括队伍编号、队员编号、成绩和总成绩。
- 根据队伍编号可以把整个输入序列分为k队,同一队成员的分数累加到最后一个同队成员里即可。
AC代码
#include<iostream>
#include<cstdio>
using namespace std;
struct Node
{int num_team;int num_member;int grade;int total;
};
int main()
{int i,j,n;cin>>n;Node node[n];for(i=0;i<n;i++){scanf("%d-%d %d",&node[i].num_team,&node[i].num_member,&node[i].grade);node[i].total=node[i].grade;}for(i=0;i<n;i++)for(j=0;i!=j&&j<n;j++)//i!=j既能保证不重复加自身,也能简化计算(把总分累加到同队的最后个队员上){if(node[i].num_team==node[j].num_team){node[i].total=node[i].total+node[j].grade;}}int max_num=0;//假设第一个队的总分最高for(i=1;i<n;i++){if(node[i].total>node[max_num].total)max_num=i;//获得总分最高的队伍编号}cout<<node[max_num].num_team<<" "<<node[max_num].total;return 0;}
有任何问题,欢迎在评论区留言,博主每天都会看的哟!
更多题解
pat 乙级 题解汇总(持续更新)(C++)