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]);