• hdu4923 Room and Moor


    给一个长度为n的A数列。每一个数是0或1,要求构造一个递增数列B,长度为n,每一个数为[0,1]的实数,使得∑(Ai-Bi)2最小。


    能够发现,最前面连续的0和最后面连续的1都没有意义。中间能够看成1和0个数不同的101010串。

    对于当中每个10串。这段B序列取得最佳值是  1的个数/总个数,

    每次加入取一段,假设这一段的最佳值小于上一段的取值,那么就把两段合起来更新一个新的最佳值。然后再往前比較,直到满足递增序列位置。

    看了别人代码发现,这样想是对的,在处理的时候事实上不用分10段。直接逐个处理是一样的。


    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <string>
    #include <algorithm>
    #include <map>
    using namespace std;
    
    double x,s[100010][2];
    
    int main()
    {
        int icy,n,cnt,i;
        scanf("%d",&icy);
        while(icy--)
        {
            scanf("%d",&n);
            cnt=0;
            for(i=0;i<n;i++)
            {
                scanf("%lf",&x);
                s[cnt][0]=x;
                s[cnt++][1]=1;
                while(cnt>=2)
                {
                    if(s[cnt-1][0]/s[cnt-1][1]>=s[cnt-2][0]/s[cnt-2][1]) break;
                    s[cnt-2][0]+=s[cnt-1][0];
                    s[cnt-2][1]+=s[cnt-1][1];
                    cnt--;
                }
            }
            double ans=0;
            for(i=0;i<cnt;i++)
            {
                double tmp=s[i][0]/s[i][1];
                ans+=(tmp*tmp*(s[i][1]-s[i][0])+(1-tmp)*(1-tmp)*s[i][0]);
            }
            printf("%.6lf
    ",ans);
        }
        return 0;
    }
    


  • 相关阅读:
    delphi多线程加锁
    delphi中pchar、char、string的定义与区别
    delphi指针
    关于delphi函数的调用顺序问题
    easyexcel
    # springcloud-eureka-feign-mybatis-seata ### 整合步奏
    zuul网关
    ## feign远程调用开启熔断
    eureka2
    Eureka
  • 原文地址:https://www.cnblogs.com/yxysuanfa/p/6721953.html
Copyright © 2020-2023  润新知