雕刻时光

just do it……nothing impossible
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

题目1501:最大连续子序列乘积

Posted on 2013-10-30 20:11  huhuuu  阅读(269)  评论(0编辑  收藏  举报

http://ac.jobdu.com/problem.php?pid=1501

如果一行数列里没有0,则 

我的方法是用两个变量正数与负数,sum表示前面数的乘积, 随时将sum 正负归类放在两个变量里,

到 i 位置若为sum为负数,则在负数优先队列里找最大的负数去除

到 i 位置若为sum为正数,则在正数优先队列里找<1的正数去除

 

如果有0,则遇到0 就重新计算后面的数列

//7 -1.1 -2.2 -1.1 3.3 -1.1 -2.5 4

//2 0 2

#include<stdio.h>
#include<math.h>

double zmin;//ᅰ�ᅧ�
double Fmax;//ᄌ쳐�
double inp[100099];
double dp[100099];

int main(){
    int n;
    while(scanf("%d",&n)!=EOF){
        int i;
        double sum=1;
        int zero=0;
        int zok=0,fok=0;

        for(i=1;i<=n;i++){
            
            scanf("%lf",&inp[i]);
            if(zero==0){
                sum=inp[i];
                if(inp[i]==0)zero=0;
                else
                    zero=1;
                dp[i]=inp[i];
                zok=0;
                fok=0;
                if(inp[i]>0){
                    zok=1;
                    zmin=inp[i];
                }
                if(inp[i]<0){
                    fok=1;
                    Fmax=inp[i];
                }
                continue;
            }

            sum*=inp[i];

            if(sum<0){
                if(fok==1)
                    dp[i]=sum/Fmax;
                else
                    dp[i]=sum;

                if(fok==0){
                    fok=1;
                    Fmax=sum;
                }else{
                    if(Fmax<sum)Fmax=sum;
                }
                continue;
            }
            if(sum>0){
                if(zok==1&&zmin<1){
                    dp[i]=sum/zmin;
                }else
                    dp[i]=sum;
                if(zok==0){
                    zok=1;
                    zmin=sum;
                }else{
                    if(zmin>sum)zmin=sum;
                }
                continue;
            }
            if(sum==0){
                dp[i]=0;
                zero=0;
            }
        }

        double max=-1;
        for(i=1;i<=n;i++){
            if(dp[i]>max)max=dp[i];
        }
        if(max<0)printf("-1\n");
        else {
            if(fabs(max-(int)max)<0.0000001)
                printf("%.0lf\n",max);
            else
                printf("%.2lf\n",max);
        }
    }

    return 0;
}
View Code