hdu 4561 連續最大積

點擊打開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;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章