题意:

       给你序列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. [Elementary Mechanics Using Python-02]Feather in tornado

    Problem 9.17 Feather in tornado. In this project you will learn to use Newton's laws and the force m ...

  2. 将samba共享目录映射为本地文件夹(百度网盘直接下载到samba共享目录下)

    将samba共享目录映射为本地文件夹(百度网盘直接下载到samba共享目录下) 前面淘了一个蜗牛星际的矿机,打算拿来做个个人云盘,就装上了Linux用smb把硬盘共享出来 访问倒是很爽,就是发现下东西 ...

  3. celery 与 flask 实现异步任务调度

    Flask 定了2中上下文,来实现机遇线程\协程的,wsgi服务的请求(request.session)和存储(g,current_app )过程,通过栈来完成不同线程和协程的上下文切换,在与cele ...

  4. ubuntu18.04+gunicorn+nginx+supervisor+mysql+redis安装django项目

    Ubuntu18.04 install Django project 项目准备: ECS 实例 (云服务器) 此安装部署方案适合本地ubuntu18.04系统安装和虚拟机中ubuntu18.04系统安 ...

  5. 追洞小组 | 实战CVE-2020-7471漏洞

    出品|MS08067实验室(www.ms08067.com) 本文作者:守拙(Ms08067实验室追洞小组成员) 一.漏洞名称: 通过StringAgg(分隔符)的潜在SQL注入漏洞 二.漏洞编号: ...

  6. 获取SpringBoot中所有的url和其参数

    获取所有url和方法的对应关系 1 @Data 2 public class Param { 3 4 /** 5 * 字段名称 6 */ 7 private String name; 8 9 /** ...

  7. idea配置struts2.5环境

    struts2不是struts1的下一代产品,是在struts1和WebWork技术的基础上进行合并后的全新框架,虽然两个名字相似,但是设计思想却有很大的不同. 使用本地的l ib 或者downloa ...

  8. 2018年11月16日SQL Server实验内容(触发器实验)

    --注意:先把studentmanager数据库中的所有表用select into命令复制一份, --然后用复制后新表完成下面的实验,同时,对每个触发器都要进行验证. select *into dep ...

  9. python 查看模块中的方法

    way 1.help() way 2.dir() # dir() 函数不带参数时,返回当前范围内的变量.方法和定义的类型列表: way 3. 使用inspect模块, inspect.getmembe ...

  10. 【Azure 应用服务】App Service 在使用GIt本地部署,上传代码的路径为/home/site/repository,而不是站点的根目录/home/site/wwwroot。 这个是因为什么?

    问题描述 App Service 在使用GIt本地部署,上传代码的路径为/home/site/repository,而不是站点的根目录/home/site/wwwroot. 这个是因为什么? 并且通过 ...