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

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

题目1501:最大连续子序列乘积
#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

 

你可能感兴趣的:(序列)