N个整数组成的序列a[1],a[2],a[3],…,a[n],你可以对数组中的一对元素进行交换,并且交换后求a[1]至a[n]的最大子段和,所能得到的结果是所有交换中最大的。当所给的整数均为负数时和为0。
例如:{-2,11,-4,13,-5,-2, 4}将 -4 和 4 交换,{-2,11,4,13,-5,-2, -4},最大子段和为11 + 4 + 13 = 28。

收起

 

输入

  1. 1行:整数序列的长度N2 <= N <= 50000)
  2. 2 - N + 1行:N个整数(-10^9 <= A[i] <= 10^9

输出

  1. 输出交换一次后的最大子段和。

输入样例

  1. 7
  2. -2
  3. 11
  4. -4
  5. 13
  6. -5
  7. -2
  8. 4

输出样例

  1. 28
  2.  
  3. 这里用前缀和,对于每一个区间[l,r]的和为sum[r] - sum[l - 1] - min[l,r] + max(max[l - 1],max[r + 1]),其中max(max[l - 1],max[r + 1])可以先打表,只要知道了lr,就可以得出,sum[r] - min[l,r],也比较好求,显然sum[r]应该越大越好,那么我们可以枚举l,保证sum[r],足够大,且sum[r] - min[l,r]足够大,计算sum[r] - min[l,r],只需要用遍历到当前最大的sum,找到最大的sum - s[i]即可。
    代码:
  1. #include <iostream>
  2. #include <cstdlib>
  3. #include <cstdio>
  4. #define inf 0x3f3f3f3f3f3f3f3f
  5. using namespace std;
  6. typedef long long ll;
  7. ///formula : sum[r] - sum[l - 1] - min[l,r] + max(max[1,l - 1],max[r + 1,n])
  8. int n;
  9. ll sum[];
  10. int s[];
  11. int lmax[],rmax[];
  12. int main() {
  13. while(~scanf("%d",&n)) {
  14. for(int i = ;i <= n;i ++) {
  15. scanf("%d",&s[i]);
  16. sum[i] = sum[i - ] + s[i];
  17. }
  18. for(int i = ;i < n;i ++) {
  19. lmax[i + ] = max(lmax[i],s[i + ]);
  20. rmax[n - i] = max(rmax[n - i + ],s[n - i]);
  21. }
  22. int maxi = n;
  23. ll sumr_min,ans = ;
  24. for(int i = n;i >= ;i --) {
  25. if(sum[i] >= sum[maxi]) {
  26. maxi = i;
  27. sumr_min = sum[i] - s[i];
  28. }
  29. sumr_min = max(sumr_min,sum[maxi] - s[i]);
  30. ans = max(ans,sumr_min - sum[i - ] + max(lmax[i - ],rmax[maxi + ]));
  31. }
  32. printf("%lld\n",ans);
  33. }
  34. return ;
  35. }

51nod 1254 最大子段和 V2的更多相关文章

  1. 51nod 1254 最大子段和 V2 ——单调栈

    N个整数组成的序列a[1],a[2],a[3],…,a[n],你可以对数组中的一对元素进行交换,并且交换后求a[1]至a[n]的最大子段和,所能得到的结果是所有交换中最大的.当所给的整数均为负数时和为 ...

  2. 51nod 最大M子段和系列

    1052 最大M子段和 N个整数组成的序列a[1],a[2],a[3],…,a[n],将这N个数划分为互不相交的M个子段,并且这M个子段的和是最大的.如果M >= N个数中正数的个数,那么输出所 ...

  3. 51Nod 最大M子段和系列 V1 V2 V3

    前言 \(HE\)沾\(BJ\)的光成功滚回家里了...这堆最大子段和的题抠了半天,然而各位\(dalao\)们都已经去做概率了...先%为敬. 引流之主:老姚的博客 最大M子段和 V1 思路 最简单 ...

  4. 51nod 1053 最大M子段和 V2

    N个整数组成的序列a[1],a[2],a[3],…,a[n],将这N个数划分为互不相交的M个子段,并且这M个子段的和是最大的.如果M >= N个数中正数的个数,那么输出所有正数的和. 例如:-2 ...

  5. 51nod 最大M子段和系列(1052、1053、1115)

    51nod1052 数据量小,可使用O(N*M)的DPAC,递推公式: dp[i][j]=max(dp[i-1][j-1], dp[i][j-1])+a[j]; dp[i][j]表示前j个数取 i 段 ...

  6. 最大M子段和 V2

    51nod1053 这题还是我们熟悉的M子段和,只不过N,M<=50000. 这题似乎是一个堆+链表的题目啊 开始考虑把所有正数负数锁在一起. 比如: 1 2 3 -1 –2 -3 666 缩成 ...

  7. 51Nod 1108 距离之和最小 V2 1096 距离之和最小 中位数性质

    1108 距离之和最小 V2基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 收藏 关注三维空间上有N个点, 求一个点使它到这N个点的曼哈顿距离之和最小,输出这个最小 ...

  8. [51nod1254]最大子段和 V2

    N个整数组成的序列a[1],a[2],a[3],-,a[n],你可以对数组中的一对元素进行交换,并且交换后求a[1]至a[n]的最大子段和,所能得到的结果是所有交换中最大的.当所给的整数均为负数时和为 ...

  9. 51NOD 1185 威佐夫游戏 V2(威佐夫博弈)

    1185 威佐夫游戏 V2  基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题  收藏  关注 有2堆石子.A B两个人轮流拿,A先拿.每次可以从一堆中取任意个或从2堆中取 ...

随机推荐

  1. Spring Boot 的Logback

    Spring Boot 默认使用Logback记录日志 Spring Boot starter 都会默认引入spring-boot-starter-logging,不需要再引入 日志级别从高到低:TR ...

  2. java对象池化技术

    https://blog.csdn.net/tiane5hao/article/details/85957840 文章目录 先写一个简单通用的对象池 通过上面的通用池实现jedis连接池 连接池测试 ...

  3. 文件和异常练习2——python编程从入门到实践

    10-6 加法运算:提示用户输入提供数值输入,常出现的一个问题是,用户提供的是文本而不是数字.这种情况下,当你尝试将输入转换为整数时,将 引发TypeError异常.编写一个程序,提示用户输入两个数字 ...

  4. Mysql练习题(1)

    表名和字段------------------------------------------------------------------------------–1.学生表Student(s_i ...

  5. linux查看当前路径命令 pwd

    pwd命令能够显示当前所处的路径. 这个命令比较简单,如果有时在操作过程中忘记了当前的路径,则可以通过此命令来查看路径,其执行方式为: # pwd /home/your_username 第一行为运行 ...

  6. golang 之 jwt-go

    主要针对jwt-go快速生成token.和如何取进行介绍,具体详情还请查看 github.com/dgrijalva/jwt-go 生成token package main import ( &quo ...

  7. 笔记:npm常见错误

    常见错误 破坏的npm安装 随机错误 找不到兼容版本 权限错误 Error: ENOENT, stat 'C:\Users\<user>\AppData\Roaming\npm' 在Win ...

  8. .NET-异步操作

    感觉可以用于log日志的东西,这个东西他还是会走的但是不会影响你下一步的操作,你下一步还是正常怎么操作就怎么操作! 这样可以给用户免掉一些没必要的等待. static void Main(string ...

  9. python 基础(集合)

    #set里的元素是唯一的,即没有重复的,可以用set()函数,去数据的重复冗余 L = [1,1,1,2,4,5,6,7] S = set(L) print(S) #打印结果{1, 2, 4, 5, ...

  10. honeyd路由拓扑

    create router //创建路由器模版 set router personality "Cisco 7206 running IOS 11.1(24)" //指纹 add ...