求助 第四个样例过不了原因

P2367 语文成绩

yuanyun @ 2020-09-20 21:34:03

数组下标从0开始,第四个样例过不了。 当然换成下标从1 开始还是能AC的。 想知道从0开始过不了的原因:)

// #include<bits/srdc++.h>
#include<iostream>
#include<cstdio>
#include<vector>
#include<algorithm>
using namespace std;
    int v[5000001];
    int b[5000001];
int main(){
    int n, p;
    scanf("%d %d", &n, &p);

    for (int i = 0; i < n;i++){
        scanf("%d", &v[i]);
    }
    b[0] = v[0];
    for (int i = 1; i < n;i++){
        b[i] = v[i] - v[i - 1];
    }
    for (int i = 0; i < p;i++){
        int x, y, z;
        cin >> x >> y >> z;
        b[x-1] += z;

        b[y]-=z;
    }
    int min=1e9;
    v[0] = b[0];
    for (int i = 1; i < n;i++){
        v[i] = v[i-1] + b[i];
        if(min>v[i])
            {
                min=v[i];
            }
    }
    cout<<min;
    return 0;
}

by SalomeJLQ @ 2020-09-20 21:40:35

b[x-1] += z;

这里下标从0和1开始好像就不一样了


by yuanyun @ 2020-09-24 20:37:51

@爵士 不好意思 没想到这么快就有回复。。 我觉得因为是从0 开始,所以第x个人就是在[x-1]


by yuanyun @ 2020-09-24 20:42:39

@爵士 然后这样是能过的,区别只是换了下标(

// #include<bits/srdc++.h>
#include<iostream>
#include<cstdio>
#include<vector>
#include<algorithm>
using namespace std;
    int v[5000001];
    int b[5000001];
int main(){
    int n, p;
    scanf("%d %d", &n, &p);

    for (int i = 1; i <= n;i++){
        scanf("%d", &v[i]);
    }
    // b[0] = v[0];
    for (int i = 1; i <= n;i++){
        b[i] = v[i] - v[i - 1];
    }
    for (int i = 0; i < p;i++){
        int x, y, z;
        cin >> x >> y >> z;
        b[x] += z;

        b[y+1]-=z;
    }
    int min=1e9;
    for (int i = 1; i <= n;i++){
        v[i] = v[i-1] + b[i];
    if(min>v[i])
        {
            min=v[i];
        }
    }
    cout<<min;
    return 0;
}

by SalomeJLQ @ 2020-09-24 20:59:08

@yuanyun 估计是因为题目的输入,说的是a1到an,所以你输入的时候如果从0开始,那么中间的操作就需要+1,否则下标就和题目的对不上了(差了一但足以过不了)


by LYM20114 @ 2021-11-05 17:13:17

这样写更香: sumd[i] = sumd[i - 1] + cha[i]; minn = min(minn,sumd[i]);


|