点击打开hdu4561
思路:
这个题目是个模拟题,比赛的时候没有做出来感觉很恶心。言归正转,这个题目很容易错,问题在于你做的思路够不够完善,需要注意,不能单边考虑,需要尽量完善。我给几组数据,如果能过,那么应该就可以。
20
6
-2 -2 2 -2 -2 2 6
8
-2 -2 -2 0 2 -2 2 2 2
8
-2 2 -2 0 2 -2 2 -2 4
4
2 2 -2 2 2
3
2 -2 2 1
3
-2 2 2 2
6
2 -2 2 -2 2 -2 5
6
-2 2 -2 2 -2 2 5
3
0 -2 2 1
我的办法是用p2记录-2的个数,然后如果p2为偶数直接加上该段区间的2与-2的个数和,如果为奇数,那么就要找最后第奇数个-2两边的积,那边最大,就是那边。
#include<iostream>
#include<cstring>
#include<stdio.h>
using namespace std;
int k1[10005],k2[10005],s[10005];
int main()
{int t,n;scanf("%d",&t);int cnt=0;while(t--){scanf("%d",&n);memset(s,0,sizeof(s));memset(k1,0,sizeof(k1));memset(k2,0,sizeof(k2));for(int i=1;i<=n;i++){scanf("%d",&s[i]);}int max=0;int p1=0,p2=0,q1=0,q2=0,sum=0;for(int i=1;i<=n;i++){if(s[i]){if(s[i]==-2){p2++;//q2++;if((p2%2)==0) p1+=q1,q1=0;}else if(s[i]==2){// p1++;if(p2%2) q1++;else p1++;}//cout<<p1<<" "<<q1<<endl;if(p2%2){if(p1>=q1)sum=p1+(p2-1);else sum=q1+(p2-1);}else sum=p1+p2+q1;if(sum>max) max=sum;}else{p1=p2=q1=0;}}p1=0,p2=0,q1=0,q2=0;for(int i=n;i>=1;i--){if(s[i]){if(s[i]==-2){p2++;//q2++;if((p2%2)==0) p1+=q1,q1=0;}else if(s[i]==2){// p1++;if(p2%2) q1++;else p1++;}//cout<<p1<<" "<<q1<<endl;if(p2%2){if(p1>=q1)sum=p1+(p2-1);else sum=q1+(p2-1);}else sum=p1+p2+q1;if(sum>max) max=sum;}else{p1=p2=q1=0;}}printf("Case #%d: %d\n",++cnt,max);}return 0;
}