文章

3

粉丝

97

获赞

14

访问

3.9k

头像
最大序列和 题解:
P1172 清华大学/兰州大学2019机试
发布于2024年9月6日 16:21
阅读数 1.6k

看了下数据范围,需要在O(n)下解决,区间和一眼维护前缀和做差即可,现在要求最大序列和,对于每一位前缀和,维护一下本身与其右边所有数的最小值,该位的前缀和与该其左侧的最小值的差值就是以该位为终点的前缀和最大值,遍历一遍整个前缀和序列,找到全部范围的最大值就行。

  1. #include<cstdio>
  2. #include<iostream>
  3. #include<cstring>
  4. #include<queue>
  5. #include<stack>
  6. #include<algorithm>
  7. using namespace std;
  8. #define maxn 1000000+10
  9. #define inf 0x3f3f3f3f
  10. #define ll long long
  11. ll n;
  12. ll sa[maxn];
  13. ll minn[maxn];
  14. int main() {
  15. // freopen("1.txt","r",stdin);
  16. while(cin>>n){
  17. ll cnt;
  18. memset(minn,127,sizeof(minn));
  19. minn[0]=0;
  20. for(int i=1;i<=n;i++){
  21. cin>>cnt;
  22. sa[i]=sa[i-1]+cnt;
  23. // cout<<minn[i-1]<<" ";
  24. if(sa[i]<minn[i-1]){
  25. minn[i]=sa[i];
  26. }
  27. else
  28. minn[i]=minn[i-1];
  29. // cout<<sa[i]<<" ";
  30. }
  31. ll maxx=-0x7FFFFFFFFFFFFFFF;
  32. for(int i=1;i<=n;i++){
  33. maxx=max(sa[i]-minn[i-1],maxx);
  34. // cout<<sa[i]-minn[i-1]<<" ";
  35. }
  36. cout<<maxx<<endl;
  37. }
  38. return 0;
  39. }

 

登录查看完整内容


登录后发布评论

暂无评论,来抢沙发