题目
题目请忽略,为了用事实说明挖掘机技术到底哪家强,PAT 组织了一场挖掘机技能大赛。现请你根据比赛结果统计出技术最强的那个学校。
输入格式:
输入在第 1 行给出不超过 10^5的正整数 N,即参赛人数。随后 N 行,每行给出一位参赛者的信息和成绩,包括其所代表的学校的编号(从 1 开始连续编号)、及其比赛成绩(百分制),中间以空格分隔。
输入格式
在一行中给出总得分最高的学校的编号、及其总分,中间以空格分隔。题目保证答案唯一,没有并列。
思路
用一个数组去存储各个学校的总分数,再遍历求分数最大值的学校,并输出其编号与分数。
//foreverking
#include <vector>
#include <cstdio>
#include <queue>
#include <algorithm>
#include <cstring>
#include <iostream>
#include <cmath>
using namespace std;
const int N = 1e5 + 1;
int n;
int sum[N];
int main(){
cin >> n;
for(int i = 0; i < n; i++) {
int school,score;
cin >> school >> score;
sum[school] += score;//将分数加入
}
int maxx = 1;//学校从1开始编号
for(int i = 1; i < n; i++){
if(sum[maxx] < sum[i]){
maxx = i;
}
}
cout << maxx << " " << sum[maxx] << endl;
return 0;
}
最后一个点过不了,超时了,我想了想选择用vector存各学校的分数。
//foreverking
#include <vector>
#include <cstdio>
#include <queue>
#include <algorithm>
#include <cstring>
#include <iostream>
#include <cmath>
using namespace std;
int n;
int main(){
cin >> n;
vector<int> v(n + 1);
for(int i = 0; i < n; i++) {
int school,score;
cin >> school >> score;
v[school] += score;//将分数加入
}
int maxx = 1;//学校从1开始编号
for(int i = 1; i < n; i++){
if(v[maxx] < v[i]){
maxx = i;
}
}
cout << maxx << " " << v[maxx] << endl;
return 0;
}
成功过了,但是回过头看第一个代码,发觉是边界问题,只需const int N = 1e5 + 1;就可以通过。