hdu4923 f(A,B)分段处理
题意:
给你序列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)分段处理相关推荐
- java 分段读取数据_java _io_ .read()分段读取字节
java _io_ .read()分段读取字节 发布时间:2020-05-06 11:22:43 来源:51CTO 阅读:256 作者:wx5d21d5e6e5ab1 byte[] flush =ne ...
- r语言数据变量分段_使用R语言实现数据分段
使用R语言实现数据分段 今天跟大家讲讲我工作中用到的数据分段,数据分段一般在什么地方会使用到呢?评分.之前写过一篇<实战: RFM>模型使用,那篇文章就详细介绍了CRM(客户关系管理)分析 ...
- c语言学习笔记之分段函数
内容来自哔哩哔哩视频 [浙江大学]C语言入门与进阶 翁恺 学习笔记 分段函数 if ( x < 0 ) { f = -1; } else if ( x == 0 ) { f = 0; } els ...
- python文件io是啥意思_Python文件IO(普通文件读写)
## 打开一个文件 - fileobj = open(filename, mode) 其中: fileobj是open()返回的文件对象 filename是该文件的字符串名 mode是指明文件类型和操 ...
- Nmap中文手册浅析
索引目录: Nmap五大基本功能 Nmap -h(中文手册) 目标说明 主机发现 端口扫描技术 端口说明和扫描顺序 服务和版本检测 操作系统检测 时间和性能 防火墙/IDS躲避和欺骗 输出 其它选项 ...
- 数学建模3 插值算法
数模比赛中,常常需要根据已知的函数点进行数据.模型的处理和分析,而有时候现有的数据是极少的,不足以支撑分析的进行,这时就需要使用一些数学的方法,"模拟产生"一些新的但又比较靠谱的值 ...
- 华中科技计算机第七次作业,电路理论(黑皮版) 华中科技大学陈明辉第7章
<电路理论(黑皮版) 华中科技大学陈明辉第7章>由会员分享,可在线阅读,更多相关<电路理论(黑皮版) 华中科技大学陈明辉第7章(80页珍藏版)>请在人人文库网上搜索. 1.7- ...
- [ZJOI2015]醉熏熏的幻想乡
醉熏熏的幻想乡 题解 相当阴间的一道题 首先如果只用解决第一小问的话,我们很容易想到通过网络流来求最大流的. 但是我们现在还要保证总费用最小呀,这该怎么办?拆成许多个点费用流,不TTT才怪. 我们假设 ...
- (最优化理论与方法)第二章最优化所需基础知识-第七节:保凸的运算和共轭函数
文章目录 一:保凸的运算 (1)非负加权和 (2)与仿射函数的复合 (3)逐点取最大值 (4)逐点取上界 (5)与标量函数复合 (6)与向量函数复合 (7)取下确界 (6)透视函数 二:共轭函数 (1 ...
最新文章
- SmartAuditor----IT访问审计解决方案
- lvs keepalived 安装配置详解【转】
- 【JUC并发编程10】阻塞队列
- 7-25日牛客网刷题 未知点、错题 集合
- 5 分钟解决前后端联调问题,说一说前端代理这件事
- ES6新特性之函数优化-箭头函数
- 盘点十个超级实用的 JS 特性
- Tip:强制执行exchange DAG节点之间的数据库副本移动
- wegame饥荒一直登录中_经历网游和单机发行的左右摇摆后,Wegame决定“我全都要”...
- XCode - 无法对iPhone真机调试的解决方法!
- Vue的babel-plugin-transform-remove-console依赖使用方法
- 通过深度优先搜索(DFS)对图的边进行分类
- 创建第二个 vlan network vlan101 - 每天5分钟玩转 OpenStack(96)
- 技巧~向URL地址添加参数
- Uplift modeling for clinical trial data 论文阅读
- 程序员版本的八荣八耻,爱了
- 中国IT的领路人——播布客
- 前端工程师 后段工程师_如何像工程师一样思考
- java set list map_Java中的Set,List,Map
- beyond compare linux中文包,linux 下安装 Beyond Compare