HDU 4924 Room and Moor

题目链接

题意:给定一个01组成的a序列。要求一个b序列,b序列每一个数值为[0, 1]之间的数,而且b序列为非递减序列,要求∑(aibi)2最小,求这个最小值

思路:推理,非常easy看出,开头一段的0和末尾一段的1等于没有。然后中间每段相似111000这样1在前,0在后的序列。都能够列出一个公式,非常easy推出选择的x为共同的一个值,为1的个数/(1的个数+0的个数)a,那么问题就变成要维护一个递增的x。利用一个栈去做维护,假设遇到一个位置递减了。那么就把它和之前的段进行合并,维护栈中递增,最后把栈中元素都拿出来算一遍就是答案了

代码:

#include <cstdio>
#include <cstring>
#include <stack>
using namespace std; const int N = 100005;
const double eps = 1e-8; int t, n, a[N];
struct Seg {
double one, zero, x;
Seg() {}
Seg(double one, double zero, double x) {
this->one = one;
this->zero = zero;
this->x = x;
}
} s[N]; double cal(double one, double zero) {
return one / (one + zero);
} double solve(int n) {
int sn = 0;
int one = 0, zero = 0, now = 0;
while (now < n && !a[now]) {now++;}
while (n >= 0 && a[n]) n--;
if (now > n) return 0.0;
while (now <= n) {
double one = 0, zero = 0;
while (a[now]) {
one += 1;
now += 1;
}
while (now <= n && !a[now]) {
zero += 1;
now += 1;
}
s[sn].one = one;
s[sn].zero = zero;
s[sn++].x = cal(one, zero);
}
stack<Seg> st;
st.push(s[0]);
for (int i = 1; i < sn; i++) { Seg now = s[i]; while (!st.empty() && st.top().x - now.x > -eps) {
Seg pre = st.top();
st.pop();
pre.one += now.one;
pre.zero += now.zero;
pre.x = cal(pre.one, pre.zero);
now = pre;
}
st.push(now); }
double ans = 0;
while (!st.empty()) {
Seg now = st.top();
st.pop();
ans += (1 - now.x) * (1 - now.x) * now.one + now.x * now.x * now.zero;
}
return ans;
} int main() {
scanf("%d", &t);
while (t--) {
scanf("%d", &n);
for (int i = 0; i < n; i++)
scanf("%d", &a[i]);
printf("%.6lf\n", solve(n - 1));
}
return 0;
}

HDU 4923 Room and Moor(推理+栈维护)的更多相关文章

  1. HDU 4923 Room and Moor (单调栈)

    题意: 给你一个A数列,让你求一个单调递增的B数列(0<=bi<=1),使得sum{(ai-bi)^2}最小. 思路: 很明显,如果A = 0...01...1,那么bi=ai即可. 可以 ...

  2. hdu 4923 Room and Moor (单调栈+思维)

    题意: 给一个0和1组成的序列a,要构造一个相同长度的序列b.b要满足非严格单调,且 值为0到1的实数.最后使得  sum((ai-bi)^2)最小. 算法: 首先a序列開始的连续0和末尾的连续1是能 ...

  3. hdu 4923 Room and Moor [ 找规律 + 单调栈 ]

    传送门 Room and Moor Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Oth ...

  4. HDU 4923 Room and Moor (多校第六场C题) 单调栈

    Problem Description PM Room defines a sequence A = {A1, A2,..., AN}, each of which is either 0 or 1. ...

  5. HDU 4923 Room and Moor

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4923 解题报告:给出一个长度为n的只包含0和1的序列,是否存在一个序列Bi满足一下条件: 1.     ...

  6. HDU 4923 Room and Moor(瞎搞题)

    瞎搞题啊.找出1 1 0 0这样的序列,然后存起来,这样的情况下最好的选择是1的个数除以这段的总和. 然后从前向后扫一遍.变扫边进行合并.每次合并.合并的是他的前驱.这样到最后从t-1找出的那条链就是 ...

  7. hdu 4923 单调栈

    http://acm.hdu.edu.cn/showproblem.php?pid=4923 给定一个序列a,元素由0,1组成,求一个序列b,元素在0~1之间,并且保证递增.输出最小的∑(ai−bi) ...

  8. [置顶] hdu 4699 2个栈维护 or 伸展树

    hdu 4699  Editor 题意:对一个数列进行操作,光标位置后面插入一个权值为x的数,删除光标前的那个数,光标左移一位,光标右移一位,求到k位置的最大的前缀和.. 注意这里的k是在光标之前的, ...

  9. HDOJ 4923 Room and Moor

    用一个栈维护b的值,每次把一个数放到栈顶. 看栈首的值是不是大于这个数,假设大于的话将栈顶2个元素合并.b的值就是这两个栈顶元素的平均值. .. Room and Moor Time Limit: 1 ...

随机推荐

  1. iOS------主题设置-->Appearance

    一.简述UIAppearance 是什么? 1.UIAppearance是一个协议 @protocol UIAppearance <NSObject> 只要遵守了UIAppearance协 ...

  2. kb-09-线段树--区间合并比较繁

    /* hdu-1540 题意:一个线段,长度为n,三种操作,Dx,挖掉某个点:R,恢复最近被挖掉的点:Qx查询该点所在的连续区间的长度: 树的节点维护三个变量,该节点左边界开始连续的个数ll,右边界开 ...

  3. HDU——1286找新朋友(欧拉函数+质数打表)

    找新朋友 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submi ...

  4. api调用安全

    直接传 key 简直就是多此一举啊,随便监听一下网络就能把你的 key 盗走. 最简单的方式是使用签名,各大开放平台都是这样做的,性能好,安全性不错. 签名基本原理是通过 key/secret 的实现 ...

  5. Java面试题之HashMap如何有效减少碰撞

    1.扰动函数算法,促使元素位置分布均匀,减少碰撞几率: 2.使用final对象,并采用合适的equals方法和hashCode方法:

  6. 标准C程序设计七---41

    Linux应用             编程深入            语言编程 标准C程序设计七---经典C11程序设计    以下内容为阅读:    <标准C程序设计>(第7版) 作者 ...

  7. Linux 之 MySQL主从同步

    MySQL主从同步 参考教程:[千峰教育] 1.架设两个虚拟服务器,都安装好mysql. 2.关闭防火墙和Selinux. service iptables stop setenforce 0 3.修 ...

  8. hdu 1575(矩阵快速幂)

    Tr A Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  9. Hash Collision DoS 问题

    Hash Collision DoS 问题http://coolshell.cn/articles/6424.html Hash Collision DoS (Hash碰撞的拒绝式服务攻击),有恶意的 ...

  10. SpringBoot+Mybatis增删改查实战

    简介 SpringBoot和Mybatis是啥请自行百度,作者这里也是花了几天时间入门了这个框架用来完成任务,并且也算符合要求的完成了任务,期间也各种百度但是没找到自己想要的那种简单易懂的教程,所以踩 ...