码迷,mamicode.com
首页 > 其他好文 > 详细

hdu4923 Room and Moor

时间:2014-08-09 21:28:19      阅读:229      评论:0      收藏:0      [点我收藏+]

标签:os   io   for   代码   amp   ios   不同的   algorithm   

给一个长度为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\n",ans);
    }
    return 0;
}


hdu4923 Room and Moor,布布扣,bubuko.com

hdu4923 Room and Moor

标签:os   io   for   代码   amp   ios   不同的   algorithm   

原文地址:http://blog.csdn.net/u011032846/article/details/38460391

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!