Codeforces 33C.Wonderful Randomized Sum

题意:

给一个数组你可以把一段前缀和乘上-1,再把一个后缀和乘上-1,前缀跟后缀之间可以有重叠部分,问操作后序列的最大和是多少

思路:

我们先考虑有重叠的部分,由于乘了两次-1,所有重合的部分不变,因此答案的方案肯定不会有重叠部分

我们假设所有元素的和为sum,从反面思考假设中间的那段和为s,那么操作后数组的和为-(sum - s) + s = 2 * s - sum

所以问题就转化为找一个最大子序列问题了

#include<iostream>
#include<algorithm>
 using namespace std;
 const int maxn=1e5+10;
 int a[maxn];
 int main()
 {
     int n,sum=0;
     scanf("%d",&n);
     for(int i=1;i<=n;i++){
         scanf("%d",&a[i]);
         sum+=a[i];
     }
     int mx,cnt=0;
     for(int i=1;i<=n;i++){
         cnt+=a[i];
         if(cnt<0) cnt=0;
         mx=max(mx,cnt);
     }
    cout<<2*mx-sum<<endl;
    return 0;
 }

猜你喜欢

转载自www.cnblogs.com/overrate-wsj/p/12285245.html