hdu4923 Room and Moor
来源:互联网 发布:淘宝数据魔方论坛 编辑:程序博客网 时间:2024/04/30 19:55
给一个长度为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;}
0 0
- HDU4923 Room and Moor
- hdu4923 Room and Moor
- hdu4923 Room and Moor 单调栈
- HDU 4923 Room and Moor
- HDU 4923 Room and Moor
- hdu 4923 Room and Moor
- hdu 4923 Room and Moor
- HDU-4923-Room and Moor
- hdoj 4923 Room and Moor
- hdu 4923 Room and Moor
- hdu 4923 Room and Moor
- hdu 4923 Room and Moor
- hdu 4923 Room and Moor
- HDOJ 4923 Room and Moor
- Hdu 4923 Room and Moor
- HDU 4923 Room and Moor
- hdu 4923 Room and Moor(线性表)
- hdu 4923 Room and Moor 堆栈
- 指针的用法
- 54点提高PHP编程效率 引入缓存机制提升性能
- c++中 int 和 string 的相互转换
- hdu 1829&&poj 2492 A Bug's Life(判二分图)
- Java读取自定义环境变量的方法System.getProperty和System.getenv
- hdu4923 Room and Moor
- 星型模型和雪花型模型比较
- 【P2P租车】宝驾租车:学大创始人李如彬再创业
- ff
- hdu2255奔小康赚大钱
- [Python]实现DES加密算法和3DES加密算法
- 【水题-前缀码】HDU 1305 Immediate Decodability
- [编程之美] PSet2.15 子数组之和的最大值(二维)
- 线程同步之Semaphore