蓝桥B组模拟之蒜厂年会

对于环形序列,最大子序列和为max{MAX,SUM-MIN};
其中:
MAX表示最大子序列和
SUM表示序列总和
MIN表示最小子序列和

#include <iostream>
#include <algorithm> 
#include <string>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <set>
#include <map>
#include <vector>
#include <stack>
#include <queue>
#include <bitset> 
#include <unordered_map>
#include <unordered_set>
#define ll long long
#define vi vector<int> 
#define si set<int>
#define pi pair<int,int> 
#define pii pair<ll,ll> 
#define pb push_back
#define mp make_pair
#define lowbit(x) (x&(-x))
#define sci(x) scanf("%d",&(x))
#define scll(x) scanf("%lld",&(x))
#define sclf(x) scanf("%lf",&(x))
#define pri(x) printf("%d",(x))
#define rep(i,j,k) for(int i=j;i<=k;++i)
#define per(i,j,k) for(int i=j;i>=k;--i)
#define mem(a,b) memset(a,b,sizeof(a)) 
using namespace std;
int main()
{
    int n;
    cin>>n;
    vector<int> m(n+1,0);
    rep(i,1,n){
    	cin>>m[i];
	}
	//sliding windows size = n
	/*testdata
	6
	1 2 3 -5 6 -1
	*/
	long long sum=0,most=0,tot=0,ant=0,less=0;
	rep(i,1,n){
		tot+=m[i];
		ant+=m[i];
		less=min(less,ant);
		if(ant>0)	ant=0;
		sum+=m[i];
		most = max(most,sum);
		if(sum<0)	sum=0;
	}
	cout<<max(tot-less,most);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/Csdn_jey/article/details/88746225
今日推荐