思路:
这个题目是个模拟题,比赛的时候没有做出来感觉很恶心。言归正转,这个题目很容易错,问题在于你做的思路够不够完善,需要注意,不能单边考虑,需要尽量完善。我给几组数据,如果能过,那么应该就可以。
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;
}