抓到一只盖子吖 2023-03-25 16:15 采纳率: 75%
浏览 9
已结题

快客编程68-语文成绩

  1. 语文成绩

题目描述
共有n名学生的语文成绩要登记,目前登记的成绩是a[1],a[2],…,a[n]。但是lester写错了不少成绩,所以他要修改成绩的时候,总是累得不行。现在他要修改p次:每次修改行为由三个数字x,y,z表示,代表第x个到第y个学生每人增加z分。他总是要一遍遍地给某些同学增加分数,又要注意最低分是多少。

我的代码得了70分,有没有人能提供一下AC代码(c++)
我的代码

#include<bits/stdc++.h>
using namespace std;
const int N=500009;
int a[N],n,p;
int main(){    
    cin>>n>>p;
    for(int i=1;i<=n;i++)cin>>a[i];
    for(int k=1;k<=p;k++){
        int x,y,z;
        cin>>x>>y>>z;
        if(x>y)swap(x,y);
        for(int i=x;i<=y;i++)a[i]+=z;
    }
    int ans=*min_element(a+1,a+n+1);
    cout<<ans<<endl;
    return 0;
} 

感谢各位,急需AC代码

  • 写回答

2条回答 默认 最新

  • IT_service_mesh 2023-03-25 16:43
    关注

    参考GPT和自己的思路:你的代码有问题在于没有考虑到x和y都有可能等于0的情况,以及忽略了题目要求求最小值的条件。以下是AC代码:

    #include<bits/stdc++.h>
    using namespace std;
    const int N=500009;
    int a[N],n,p;
    int main()
    {    
        cin>>n>>p;
        for(int i=1;i<=n;i++)cin>>a[i];
        for(int k=1;k<=p;k++)
        {
            int x,y,z;
            cin>>x>>y>>z;
            a[x]+=z; //只需要修改第x个同学的成绩
            if(y<n)a[y+1]-=z; //注意边界,只需要把区间 [x, y] 中除了第一个同学以外的同学都加上z,用前缀和来表示这个操作
        }
        int ans=a[1];
        for(int i=2;i<=n;i++)
        {
            a[i]+=a[i-1];
            ans=min(ans,a[i]);
        }
        cout<<ans<<endl;
        return 0;
    }
    

    这里的思路是将修改操作转化为差分数组的形式,即对于区间[x, y]每个同学的成绩都加上z,可以变为将第x个同学的成绩加上z,同时将第y+1个同学的成绩减去z。然后将这些操作用前缀和数组表示。最后遍历整个数组求最小值即可。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 4月9日
  • 已采纳回答 4月1日
  • 创建了问题 3月25日

悬赏问题

  • ¥20 机器学习能否像多层线性模型一样处理嵌套数据
  • ¥20 西门子S7-Graph,S7-300,梯形图
  • ¥50 用易语言http 访问不了网页
  • ¥50 safari浏览器fetch提交数据后数据丢失问题
  • ¥15 matlab不知道怎么改,求解答!!
  • ¥15 永磁直线电机的电流环pi调不出来
  • ¥15 用stata实现聚类的代码
  • ¥15 请问paddlehub能支持移动端开发吗?在Android studio上该如何部署?
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效