偷家贼吕布 2024-04-19 16:28 采纳率: 50%
浏览 1

请求帮我看看程序,找找错!

洛谷P3187


#include<iostream>
using namespace std;
int n,m,a[100000],sum;
bool fin(){
    for(int i=0;i<n-1;i++)if(a[i]+a[i+1]>m)return 0;
    return 1;
}
int main(){
    cin>>n>>m;
    for(int i=0;i<n;i++)cin>>a[i];
    if(fin()){
        cout<<0;
        return 0;
    }
    for(int i=0;i<n-1;i++)while(a[i]+a[i+1]>m)a[i+1]--,sum++;
    cout<<sum;
    return 0;
}
  • 写回答

6条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-04-19 16:28
    关注

    引自免费微信小程序:皆我百晓生

    在提供的C++代码中,存在一个小错误,导致在某些情况下可能不会正确地计算所需的步数。具体来说,在for循环内更新a[i+1]时,没有检查数组边界。

    为了解决这个问题,我们需要确保不会超出数组范围。这里是修改后的代码:

    #include<iostream>
    using namespace std;
    
    int n, m, a[100000], sum;
    bool fin(){
        for(int i=0; i < n - 1; i++) {
            if(a[i] + a[i+1] > m) {
                return false;
            }
        }
        return true;
    }
    
    int main(){
        cin >> n >> m;
        for(int i = 0; i < n; i++) {
            cin >> a[i];
        }
    
        if(fin()) {
            cout << 0;
            return 0;
        }
    
        for(int i = 0; i < n - 1; i++) {
            while(a[i] + a[i+1] > m && a[i+1] > 0) { // 添加条件检查以防止数组越界
                a[i+1]--;
                sum++;
            }
        }
        
        cout << sum;
        return 0;
    }
    

    这个改动是在while循环的条件里添加了a[i+1] > 0,这样当a[i+1]减到0时,就不会再继续减小,从而避免了数组越界的潜在风险。其他部分的代码看起来是正确的。现在这个版本应该能正确处理所有输入情况并输出所需的步数。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 4月19日

悬赏问题

  • ¥15 Workbench中材料库无法更新,如何解决?
  • ¥20 如何推断此服务器配置
  • ¥15 关于github的项目怎么在pycharm上面运行
  • ¥15 内存地址视频流转RTMP
  • ¥100 有偿,谁有移远的EC200S固件和最新的Qflsh工具。
  • ¥15 找一个QT页面+目标识别(行人检测)的开源项目
  • ¥15 有没有整苹果智能分拣线上图像数据
  • ¥20 有没有人会这个东西的
  • ¥15 cfx考虑调整“enforce system memory limit”参数的设置
  • ¥30 航迹分离,航迹增强,误差分析