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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值