HDU 4561 连续最大积

来源:互联网 发布:打车软件行业分析 编辑:程序博客网 时间:2024/05/16 15:53

题意:中文题不解释。。。


思路:把0作为划分,分段统计下区间负数的个数即可。如果是偶数个,那么直接返回区间长度。如果是奇数个,那么去掉最左边的负数及其左边所有数,算出剩下的个数,右边同理。


代码:

#include <algorithm>#include <iostream>#include <string>#include <string.h>#include <stdio.h>#include <math.h>#include <stdlib.h>#include <vector>#include <queue>#include <stack>#include <cmath>#include <list>#include <set>#include <map>using namespace std;/*--in common define-----*/#define N  10010#define E  100010#define ll long longconst int INF   =0x3fffffff;const int PRIME =999983;const int MOD   =1000000007;const int MULTI =1000000007;const double EPS=1e-8;/*--end in common define-*//*--in common use--------*/#define CUBE(x) ((x)*(x)*(x))#define SQ(x)     ((x)*(x))#define ALL(x)     x.begin(),x.end()#define CLR(x,a) memset(x,a,sizeof(x))inline bool isodd(int x){return x&1;}inline bool isodd(ll x) {return x&1;}/*--end in common use----*/int a[N];inline int gao(int l,int r){int cnt=0,ans=0;for(int i=l;i<=r;i++)if(a[i]<0) cnt++;if(cnt%2==0) return r-l+1;for(int i=l;i<=r;i++)if(a[i]<0){ans=max(ans,r-(i+1)+1);break;}for(int i=r;i>=l;i--)if(a[i]<0){ans=max(ans,i-l);break;}return ans;}int main(){int re,n,ans,Case=1;scanf("%d",&re);while(re--){scanf("%d",&n);for(int i=0;i<n;i++) scanf("%d",&a[i]);ans=0;for(int i=0,j;i<n;i=j){while(i<n && a[i]==0) i++; j=i;while(j<n && a[j]!=0) j++;if(i<n) ans=max(ans,gao(i,j-1));}printf("Case #%d: %d\n",Case++,ans);}return 0;}


原创粉丝点击