b题问题

#include <bits/stdc++.h>

using namespace std;

const int N = 1e5+100;

int a[N];

int sum[N];

int sum_copy[N];

int query(int l,int r){

return sum[r]-sum[l-1];

}

int main (){

int n;

cin>>n;

for(int i=1;i<=n;i++){

cin>>a[i];

}

int max_ans=0;

if(n<=10){

for(int i=1;i<=n;i++){

sum_copy[i]=sum_copy[i-1]+a[i];

}

}

else {

for(int i=1;i<=n;i++){

sum[i]=sum_copy[i]=sum[i-1]+a[i];

}

for(int i=11;i<=n;i++){

sum_copy[i]=query(i-9,i);

}

}

for(int i=1;i<=n;i++){

max_ans=max(sum_copy[i],max_ans);

}

cout<<max_ans;

return 0;

}

小白 我用的前缀和,为什么只能通过B题的百分之50的样例啊

全部评论
开个long long哦 int数据会爆
2 回复 分享
发布于 04-27 21:19 福建
注意数据极值,ai最大为1e9,同时n为1e5,累加和最大为1e14,超出int范围,需要开long long。 代码优化: 题目中提到n不足10时用0补齐,则我们可以把所有累加和往后移动10位,就可以不用判定n是否小于10了。因此可以将代码做下面的优化。 同时还可以注意到这里的a[]数组只用于读入,可以在读入的时候就进行累加和计算(cin>>sum[i+10], sum[i+10] += sum[i+10-1]),就只需要一个sum数组就行了(懒得打了)。 #include <bits/stdc++.h> using namespace std; const int N = 1e5+100; int a[N]; long long sum[N]; long long query(int l,int r){     return sum[r]-sum[l-1]; } int main() {     int n;     cin>>n;     for(int i=1;i<=n;i++){         cin>>a[i];     }     long long max_ans=0;     for(int i=1;i<=n;i++){         sum[i+10]=sum[i+10-1]+a[i];     }     for(int i=1;i<=n;i++){         max_ans = max(max_ans, query(i+10-9,i+10));     }     cout<<max_ans;     return 0; }
1 回复 分享
发布于 04-27 21:40 上海

相关推荐

不愿透露姓名的神秘牛友
07-04 15:36
点赞 评论 收藏
分享
深夜书店vv:腾讯是这样的,去年很多走廊都加桌子当工区
点赞 评论 收藏
分享
投递长鑫存储等公司8个岗位
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务