题意:

给一个0和1组成的序列a,要构造一个相同长度的序列b。b要满足非严格单调,且

值为0到1的实数。最后使得  sum((ai-bi)^2)最小。

算法:

首先a序列開始的连续0和末尾的连续1是能够不考虑的。

由于仅仅要b序列相应开头为0、

末尾为1,既不影响单调性又能使相应的(ai-bi)^2=0。

然后,

先找111100、11100、10这样以1開始以0结束的序列块。每一块相应的b值相等且均为

这一块的平均值,即1的个数/0和1的总个数。

可是要满足b的单调性,则我们用栈来维护,假设后面一块的均值<前面一块的均值,则

合并这两块。也就是仅仅要栈顶的块的均值小于要压入栈的块的均值,就一直合并,直到

满足单调性。再把当前的值压入栈。

最后仅仅要一块块统计相应的sum((ai-bi)^2)就是答案了。

逗逼记忆---->比赛的时候我没有想到块,仅仅想到除去前面的0和后面的1。中间的值都是一样。

用二分或者三分解决,仅仅要控制精度=。

=

P.S:   这题必须注意细节,否则极易丢失精度。主要是我代码凝视的两个我開始没有控制好的地方。

o(╯□╰)o

#include<cstdio>
#include<iostream>
#include<cstring>
#define maxn 100010
using namespace std; struct node
{
double num,v; //v表示1的个数,num表示0和1的总个数
};
node stk[maxn];
double sum[maxn],a[maxn]; int main()
{
int T,n;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
memset(sum,0,sizeof(sum));
for(int i=1;i<=n;i++)
{
scanf("%lf",&a[i]);
sum[i] = sum[i-1]+a[i];
}
int i = 1,k = n;
while(a[i]==0) i++;
while(a[k]==1) k--;
int top = 0,le = i;
node x,y;
for(;i<=k;i++)
{
if(a[i]==0)
{
while(a[i]==0 && i<=k) //这里假设不加控制i<=k,i可能超出k
i++;
double a = sum[i-1]-sum[le-1];
double b = (double)i-le;
while(top>0 && a/b<stk[top].v/stk[top].num) //这里也不能忘了top>0
{
y = stk[top--];
a += y.v;
b += y.num;
}
x.v = a;
x.num = b;
stk[++top] = x;
le = i;
}
}
double ans = 0;
while(top)
{
y = stk[top--];
double val = y.v/y.num;
ans += (1-val)*(1-val)*y.v + val*val*(y.num-y.v);
}
printf("%.6lf\n",ans);
}
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(推理+栈维护)

    HDU 4924 Room and Moor 题目链接 题意:给定一个01组成的a序列.要求一个b序列,b序列每一个数值为[0, 1]之间的数,而且b序列为非递减序列,要求∑(ai−bi)2最小,求这 ...

  3. HDU 5875 H - Function 用单调栈水过了

    http://acm.hdu.edu.cn/showproblem.php?pid=5875 单调栈,预处理to[i]表示第一个比a[i]小的数字,一直跳就可以. 这题是数据水而已. 这里学习下单调栈 ...

  4. hdu 5696 区间的价值 单调栈+rmq

    区间的价值 Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Problem D ...

  5. codeforces 817 D. Imbalanced Array(单调栈+思维)

    题目链接:http://codeforces.com/contest/817/problem/D 题意:给你n个数a[1..n]定义连续子段imbalance值为最大值和最小值的差,要你求这个数组的i ...

  6. 2019牛客暑期多校训练营(第八场)A-All-one Matrices(单调栈+思维)

    >传送门< 题意:给你一个01矩阵,求出所有不可扩大的全为1的矩阵的个数 思路:比赛的时候想到了用单调栈,但是也只是想到了,并不知道怎么用,其实和之前求二维01矩阵中全为1的矩阵最大面积非 ...

  7. 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. ...

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

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

  9. HDU 4923 Room and Moor

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

随机推荐

  1. [AngularJS] Transforming raw JSON data to meaningful output in AngularJS

    angular.module('APP', []) .controller('MainController', function($scope, UserConstants){ var user = ...

  2. [Regular Expressions] Introduction

    var str = "Is this This?"; //var regex = new RegExp("is", "gi"); var r ...

  3. VSIM生成fsdb波形文件(VERILOG)

    VSIM生成fsdb波形文件(verilog) 两步主要的设置 testbench加入函数 运行库调用 1.testbench加入函数 initial begin $fsdbDumpfile(&quo ...

  4. 黑马程序员——String类

    ------<a href="http://www.itheima.com" target="blank">Java培训.Android培训.iOS ...

  5. 实施双工通信框架:SignalR

    SignalR:基于Asp.net平台构建,利用JavaScript或者Websockets,实现在客户端与服务端异步通信的框架. Html5新规范:WebSocket

  6. HDU 5195 - DZY Loves Topological Sorting

    题意: 删去K条边,使拓扑排序后序列字典序最大 分析: 因为我们要求最后的拓扑序列字典序最大,所以一定要贪心地将标号越大的点越早入队.我们定义点i的入度为di. 假设当前还能删去k条边,那么我们一定会 ...

  7. 3、HelloKhala示例说明

    最简单的dome程序只需3行代码 int main() { //设置端口号 InetAddress listenAddr(USER_PORT); //将端口号绑定到Server NodeServer ...

  8. C++中使用stringstream简化类型转换

    C++标准库中的<sstream>提供了一个stringstream,以前基本没用过,突然发现很好用(^-^)V 参见 http://www.cplusplus.com/reference ...

  9. android之保存偏好设置信息到shareSharedPreferences,轻量级的保存数据的方法

    android之保存偏好设置信息到shareSharedPreferences,轻量级的保存数据的方法   SharedPreferences保存数据到xml文件 有时候要保存activity的某些状 ...

  10. [Apache系列]怎样在windows下配置apache vhost

    找到你的Apache安装目录,下图为小编的Apache安装的目录 2 点击conf文件夹  进入配置目录,找到httpd.conf 文件, 3 打开httpd.conf 文件,如图, 找到地475行, ...