PTA | 1032 挖掘机技术哪家强 分数 20

107 阅读2分钟

PTA | 程序设计类实验辅助教学平台 (pintia.cn)

按编号排序: image.png

求出每个编号下的cj的总和: image.png

输出最大的编号和该编号的最大值: image.png

#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;
}

image.png

bug原因

  1. 在计算总成绩的循环中,当 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++;
    }
  }

image.png

赋简要代码:

注意测试点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;
}

image.png