题意:
       给你序列A,让你构造序列B然后求出最小的f(A <B),其中A 是0,或者1组成的,而B是[0,1]的实数,f(A,B) = 求和(i从1到n) (Ai - Bi)^ 2.

思路:
      首先有一点很明确,那就是我们可以消除面连续的0,和后面连续的1,一开始我的想法是直接求中间部分的平均数, 然后就前面的连续0不用管,后面的连续1不用管,然后中间的部分就是平均数,结果妥妥的WA了,其实正解是分段处理,分成这样的 111000,10
,1110,1111100000...就是断成一些连续1加连续0组成的小段,然后对于当前的这一段的最优就是当前这段的平均数,但是有一点要注意,题目要求的是非递减顺序,那么如果当前的这一段的平均数比前面的那一段的小,我们就得把一段和上一段合并,合并之后如果还比上上一段小,那么在合并(这个地方可以用一个栈,比较方便写),最后在根据剩下的段数来计算答案,既保证了最小,有保证了上升。



#include<stdio.h>
#include<string.h>
#include<stack>

using namespace std;typedef struct
{double s0 ,s1;
}NODE;int num[110000];
NODE node[110000];int main ()
{int n ,t ,i ,s11 ,mk;scanf("%d" ,&t);while(t--){scanf("%d" ,&n);for(s11 = 0 ,i = 1 ;i <= n ;i ++){scanf("%d" ,&num[i]);if(num[i]) s11 ++;}for(mk = n + 1 ,i = 1 ;i <= n ;i ++)if(num[i]) {mk = i;break;}if(s11 == n || mk == n + 1){puts("0.000000");continue;}int tt = 0;double s1 = 0 ,s0 = 0;num[n+1] = 1;for(i = mk ;i <= n ;i ++){if(num[i]) s1 ++;else s0 ++;if(!num[i] && num[i+1]){node[++tt].s1 = s1;node[tt].s0 = s0;s1 = s0 = 0;}}stack<NODE>st;NODE xin ,tou;for(i = 1 ;i <= tt ;i ++){if(st.empty()){st.push(node[i]);continue;}xin = node[i];tou = st.top();double tp = tou.s1 / (tou.s1 + tou.s0);double xp = xin.s1 / (xin.s1 + xin.s0);if(xp < tp){while(1){tou = st.top();st.pop();xin.s1 += tou.s1;xin.s0 += tou.s0;if(st.empty()){st.push(xin);break;}tou = st.top();tp = tou.s1 / (tou.s1 + tou.s0);xp = xin.s1 / (xin.s1 + xin.s0);if(xp >= tp){st.push(xin);break;}}}else st.push(node[i]);}double ans = 0;while(!st.empty()){NODE tou = st.top();st.pop();double tp = tou.s1 / (tou.s1 + tou.s0);ans += (1 - tp) * (1 - tp) * tou.s1 + tp * tp * tou.s0;}printf("%.6lf\n" ,ans);}return 0;
}

hdu4923 f(A,B)分段处理相关推荐

  1. java 分段读取数据_java _io_ .read()分段读取字节

    java _io_ .read()分段读取字节 发布时间:2020-05-06 11:22:43 来源:51CTO 阅读:256 作者:wx5d21d5e6e5ab1 byte[] flush =ne ...

  2. r语言数据变量分段_使用R语言实现数据分段

    使用R语言实现数据分段 今天跟大家讲讲我工作中用到的数据分段,数据分段一般在什么地方会使用到呢?评分.之前写过一篇<实战: RFM>模型使用,那篇文章就详细介绍了CRM(客户关系管理)分析 ...

  3. c语言学习笔记之分段函数

    内容来自哔哩哔哩视频 [浙江大学]C语言入门与进阶 翁恺 学习笔记 分段函数 if ( x < 0 ) { f = -1; } else if ( x == 0 ) { f = 0; } els ...

  4. python文件io是啥意思_Python文件IO(普通文件读写)

    ## 打开一个文件 - fileobj = open(filename, mode) 其中: fileobj是open()返回的文件对象 filename是该文件的字符串名 mode是指明文件类型和操 ...

  5. Nmap中文手册浅析

    索引目录: Nmap五大基本功能 Nmap -h(中文手册) 目标说明 主机发现 端口扫描技术 端口说明和扫描顺序 服务和版本检测 操作系统检测 时间和性能 防火墙/IDS躲避和欺骗 输出 其它选项 ...

  6. 数学建模3 插值算法

    数模比赛中,常常需要根据已知的函数点进行数据.模型的处理和分析,而有时候现有的数据是极少的,不足以支撑分析的进行,这时就需要使用一些数学的方法,"模拟产生"一些新的但又比较靠谱的值 ...

  7. 华中科技计算机第七次作业,电路理论(黑皮版) 华中科技大学陈明辉第7章

    <电路理论(黑皮版) 华中科技大学陈明辉第7章>由会员分享,可在线阅读,更多相关<电路理论(黑皮版) 华中科技大学陈明辉第7章(80页珍藏版)>请在人人文库网上搜索. 1.7- ...

  8. [ZJOI2015]醉熏熏的幻想乡

    醉熏熏的幻想乡 题解 相当阴间的一道题 首先如果只用解决第一小问的话,我们很容易想到通过网络流来求最大流的. 但是我们现在还要保证总费用最小呀,这该怎么办?拆成许多个点费用流,不TTT才怪. 我们假设 ...

  9. (最优化理论与方法)第二章最优化所需基础知识-第七节:保凸的运算和共轭函数

    文章目录 一:保凸的运算 (1)非负加权和 (2)与仿射函数的复合 (3)逐点取最大值 (4)逐点取上界 (5)与标量函数复合 (6)与向量函数复合 (7)取下确界 (6)透视函数 二:共轭函数 (1 ...

最新文章

  1. SmartAuditor----IT访问审计解决方案
  2. lvs keepalived 安装配置详解【转】
  3. 【JUC并发编程10】阻塞队列
  4. 7-25日牛客网刷题 未知点、错题 集合
  5. 5 分钟解决前后端联调问题,说一说前端代理这件事
  6. ES6新特性之函数优化-箭头函数
  7. 盘点十个超级实用的 JS 特性
  8. Tip:强制执行exchange DAG节点之间的数据库副本移动
  9. wegame饥荒一直登录中_经历网游和单机发行的左右摇摆后,Wegame决定“我全都要”...
  10. XCode - 无法对iPhone真机调试的解决方法!
  11. Vue的babel-plugin-transform-remove-console依赖使用方法
  12. 通过深度优先搜索(DFS)对图的边进行分类
  13. 创建第二个 vlan network vlan101 - 每天5分钟玩转 OpenStack(96)
  14. 技巧~向URL地址添加参数
  15. Uplift modeling for clinical trial data 论文阅读
  16. 程序员版本的八荣八耻,爱了
  17. 中国IT的领路人——播布客
  18. 前端工程师 后段工程师_如何像工程师一样思考
  19. java set list map_Java中的Set,List,Map
  20. beyond compare linux中文包,linux 下安装 Beyond Compare

热门文章

  1. scrapy-splash抓取动态数据例子十三
  2. Selenium的简单操作
  3. 我一直怀疑这孩子不是我亲生的,眼神太二了
  4. SAP SD买十送一的业务处理与系统实现
  5. benet 3.0的构建企业网络视频第二章地址
  6. linux 命令之电子书chm格式下载
  7. 心得体悟帖---开解语录
  8. 第二次作业 郭昭杰 201731062608
  9. GNU C和ANSI C的区别
  10. 对软件工程与计算机科学之间区别的看法