题意:

       给你序列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. Linux cut命令

    [root@wang /]# cat /etc/passwd root:x:::root:/root:/bin/bash bin:x:::bin:/bin:/sbin/nologin daemon:x ...

  2. Nmap参数详解

    转自:http://blog.csdn.net/huangwwu11/article/details/20230795 Nmap--networkmapper,网络探测工具和安全/端口扫描器 nmap ...

  3. UVa 100 - The 3n + 1 problem(函数循环长度)

    题目来源:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=3&pa ...

  4. 多普勒失真信号采样Matlab模拟分析

    多普勒失真信号采样Matlab模拟分析 方案 水声通信指的是使用声信号在水中数据传输. 相对而言.电磁信号在水中吸收严重衰减过快,光信号受水中悬浮颗粒的影响,也无法完毕远距离传输. 这两种信号的传播距 ...

  5. MLDS笔记:浅层结构 vs 深层结构

    深度学习出现之前,机器学习方面的开发者通常需要仔细地设计特征.设计算法,且他们在理论上常能够得知这样设计的实际表现如何: 深度学习出现后,开发者常先尝试实验,有时候实验结果常与直觉相矛盾,实验后再找出 ...

  6. nmap 使用总结

    nmap 网络探测工具 参考链接: https://nmap.org/man/zh/ http://www.360doc.com/content/18/0127/18/52402560_7255744 ...

  7. ping 丢包或不通时链路测试说明【转】

    转自:https://help.aliyun.com/knowledge_detail/40573.html?spm=5176.2020520165.121.d157.4fe170291Qdp4l#W ...

  8. 【bzoj3994】 SDOI2015—约数个数和

    http://www.lydsy.com/JudgeOnline/problem.php?id=3994 (题目链接) 题意 多组询问,给出${n,m}$,求${\sum_{i=1}^n\sum_{j ...

  9. 铁乐学python26_hashlib+configparser+logging模块

    大部份内容摘自博客http://www.cnblogs.com/Eva-J/ hashlib模块算法介绍 Python的hashlib提供了常见的摘要算法,如MD5,SHA1等等. 什么是摘要算法呢? ...

随机推荐

  1. 模式识别Pattern Recognition

    双目摄像头,单目摄像头缺少深度 Train->test->train->test->predicive

  2. 《进击吧!Blazor!》系列入门教程 第一章 6.安全

    <进击吧!Blazor!>是本人与张善友老师合作的Blazor零基础入门教程视频,此教程能让一个从未接触过Blazor的程序员掌握开发Blazor应用的能力. 视频地址:https://s ...

  3. Python中OS对目录的操作以及引用

    路径的获取 对当前目录的获取 1 path = os.getcwd() 2 print("获取到的当前目录是:({})".format(path)) 获取当前文件所在的绝对路径 i ...

  4. java 给时间增加时间得到一个新的时间(日期)

    SimpleDateFormat df=new SimpleDateFormat("yyyy-MM-dd") LocalDate expirationDate String exp ...

  5. 为什么要从 Linux 迁移到 BSD 4

    为什么要从 Linux 迁移到 BSD 4 许可证问题 Linux GPL 许可证对开发者的要求比较严格,它是一种开源的反模式,因为它强制发布所有修改过的源代码,并且阻止其他开源项目的集成,例如 GP ...

  6. Flask模板注入

    Flask模板注入 Flask模板注入漏洞属于经典的SSTI(服务器模板注入漏洞). Flask案例 一个简单的Flask应用案例: from flask import Flask,render_te ...

  7. Codeforces Round #538 D. Lunar New Year and a Wander

    题面: 传送门 题目描述: Bob想在公园散步.公园由n个点和m条无向边组成.当Bob到一个未经过的点时,他就会把这个点的编号记录在笔记本上.当且仅当Bob走完所有的点,他才会停下来.这时,Bob的笔 ...

  8. Vue ElementUI表格table中使用select下拉框组件时获取改变之前的值

    目前项目中有一个场景,就是表格中显示下拉框,并且下拉框的值可以更改,更改后提交后台更新.因为这个操作比较重要,所以切换时会有一个提示框,提示用户是否修改,是则走提交逻辑,否则直接返回,什么也不做. 之 ...

  9. 对用pyinstaller打包的exe程序进行反编译,获得源码

    参考文章: 1.https://www.cnblogs.com/DirWang/p/12018949.html#PyInstallerExtractor 2.https://msd.misuland. ...

  10. [set]JZOJ 5821 手机信号

    Description