抓到一只盖子吖 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日

悬赏问题

  • ¥15 MATLAB运行显示错误,如何解决?
  • ¥15 c++头文件不能识别CDialog
  • ¥15 Excel发现不可读取的内容
  • ¥15 UE5#if WITH_EDITOR导致打包的功能不可用
  • ¥15 关于#stm32#的问题:CANOpen的PDO同步传输问题
  • ¥20 yolov5自定义Prune报错,如何解决?
  • ¥15 电磁场的matlab仿真
  • ¥15 mars2d在vue3中的引入问题
  • ¥50 h5唤醒支付宝并跳转至向小荷包转账界面
  • ¥15 算法题:数的划分,用记忆化DFS做WA求调