zoukankan      html  css  js  c++  java
  • 题目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

    #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
    ");
            else {
                if(fabs(max-(int)max)<0.0000001)
                    printf("%.0lf
    ",max);
                else
                    printf("%.2lf
    ",max);
            }
        }
    
        return 0;
    }
    View Code
  • 相关阅读:
    IOI2000 回文字串
    洛谷 P2758 编辑距离
    NOIP2012普及第三题 摆花
    [SCOI2005]骑士精神
    [USACO1.5]八皇后 Checker Challenge
    Codeforces Round #637 (Div. 2) 题解
    核电站---两种DP解法
    POJ1077 八数码问题
    洛谷 P1162 填涂颜色
    jQuery火箭图标返回顶部代码
  • 原文地址:https://www.cnblogs.com/huhuuu/p/3397670.html
Copyright © 2011-2022 走看看