PTA | 程序设计类实验辅助教学平台 (pintia.cn)
按编号排序:
求出每个编号下的cj的总和:
输出最大的编号和该编号的最大值:
#include<iostream>
#include<algorithm>
using namespace std;
const int N=1e5+10;
struct People
{
int number;
int cj;
int sumcj;
}p[N];
bool cmp(struct People a,struct People b)
{
return a.number<b.number;
}
int main()
{
int n=0;cin>>n;
for(int i=0;i<n;i++)
{
cin>>p[i].number>>p[i].cj;
}
//升序排序
sort(p,p+n,cmp);
int result=0;
//打印排好序的信息
// cout<<endl;
//
// for(int i=0;i<n;i++)
// {
// cout<<p[i].number<<" "<<p[i].cj<<endl;
// }
//求总成绩
for(int i=1;i<=n;i++)
{
if(p[i].number==p[i-1].number)
{
result=p[i].cj+p[i-1].cj;
p[i].sumcj+=result;
}
}
// //打印每个编号和对应的最大值
// cout<<endl;
// for(int i=0;i<n;i++)
// {
// cout<<p[i].number<<" "<<p[i].sumcj<<endl;
// }
//求总成绩最大的那个成绩,以及该成绩对应的编号
int Max=-1;int Maxnumber=0;
for(int i=0;i<n;i++)
{
Max=max(Max,p[i].sumcj);
if(Max==p[i].sumcj)
Maxnumber=p[i].number;
}
cout<<Maxnumber<<" "<<Max<<endl;
return 0;
}
bug原因
- 在计算总成绩的循环中,当 i 到达 n-1 时,p[i+1] 将会超出数组范围,导致数组越界。你需要确保在访问数组元素之前检查索引是否越界。
// 计算总成绩
for (int i = 0; i < n; i++) {
p[i].sumcj = p[i].cj;
while (i < n - 1 && p[i].number == p[i + 1].number) {
p[i].sumcj += p[i + 1].cj;
i++;
}
}
赋简要代码:
注意测试点2测试的是输入值为0的情况,所以 a[i]>=a[m]而不是a[i]>a[m]
#include<iostream>
#include<vector>
using namespace std;
int main()
{
int m=0;
int n=0;cin>>n;
vector<int> a(n+1);
int num,score;
for(int i=0;i<n;i++)
{
cin>>num>>score;
a[num]+=score;
if(a[num]>=a[m])
{
m=num;
a[m]=a[num];
}
}
cout<<m<<" "<<a[m];
return 0;
}
二刷 柳神的代码
#include<iostream>
#include<vector>
using namespace std;
int main()
{
int n=0;cin>>n;
vector<int> a(n+1);
int num,score;
for(int i=0;i<n;i++)
{
cin>>num>>score;
a[num]+=score;
}
int maxnum=a[1],t=1;
for(int i=2;i<=n;i++)
{
if(a[i]>maxnum)
{
maxnum=a[i];
t=i;
}
}
cout<<t<<" "<<maxnum;
return 0;
}