思路:
這個題目是個模擬題,比賽的時候沒有做出來感覺很噁心。言歸正轉,這個題目很容易錯,問題在於你做的思路夠不夠完善,需要注意,不能單邊考慮,需要儘量完善。我給幾組數據,如果能過,那麼應該就可以。
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;
}