hdu 4923 Room and Moor (单调栈+思维)
题意:
给一个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 (单调栈+思维)的更多相关文章
- HDU 4923 Room and Moor (单调栈)
题意: 给你一个A数列,让你求一个单调递增的B数列(0<=bi<=1),使得sum{(ai-bi)^2}最小. 思路: 很明显,如果A = 0...01...1,那么bi=ai即可. 可以 ...
- HDU 4923 Room and Moor(推理+栈维护)
HDU 4924 Room and Moor 题目链接 题意:给定一个01组成的a序列.要求一个b序列,b序列每一个数值为[0, 1]之间的数,而且b序列为非递减序列,要求∑(ai−bi)2最小,求这 ...
- HDU 5875 H - Function 用单调栈水过了
http://acm.hdu.edu.cn/showproblem.php?pid=5875 单调栈,预处理to[i]表示第一个比a[i]小的数字,一直跳就可以. 这题是数据水而已. 这里学习下单调栈 ...
- hdu 5696 区间的价值 单调栈+rmq
区间的价值 Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Problem D ...
- codeforces 817 D. Imbalanced Array(单调栈+思维)
题目链接:http://codeforces.com/contest/817/problem/D 题意:给你n个数a[1..n]定义连续子段imbalance值为最大值和最小值的差,要你求这个数组的i ...
- 2019牛客暑期多校训练营(第八场)A-All-one Matrices(单调栈+思维)
>传送门< 题意:给你一个01矩阵,求出所有不可扩大的全为1的矩阵的个数 思路:比赛的时候想到了用单调栈,但是也只是想到了,并不知道怎么用,其实和之前求二维01矩阵中全为1的矩阵最大面积非 ...
- 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. ...
- hdu 4923 Room and Moor [ 找规律 + 单调栈 ]
传送门 Room and Moor Time Limit: 12000/6000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Oth ...
- HDU 4923 Room and Moor
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4923 解题报告:给出一个长度为n的只包含0和1的序列,是否存在一个序列Bi满足一下条件: 1. ...
随机推荐
- [AngularJS] Transforming raw JSON data to meaningful output in AngularJS
angular.module('APP', []) .controller('MainController', function($scope, UserConstants){ var user = ...
- [Regular Expressions] Introduction
var str = "Is this This?"; //var regex = new RegExp("is", "gi"); var r ...
- VSIM生成fsdb波形文件(VERILOG)
VSIM生成fsdb波形文件(verilog) 两步主要的设置 testbench加入函数 运行库调用 1.testbench加入函数 initial begin $fsdbDumpfile(&quo ...
- 黑马程序员——String类
------<a href="http://www.itheima.com" target="blank">Java培训.Android培训.iOS ...
- 实施双工通信框架:SignalR
SignalR:基于Asp.net平台构建,利用JavaScript或者Websockets,实现在客户端与服务端异步通信的框架. Html5新规范:WebSocket
- HDU 5195 - DZY Loves Topological Sorting
题意: 删去K条边,使拓扑排序后序列字典序最大 分析: 因为我们要求最后的拓扑序列字典序最大,所以一定要贪心地将标号越大的点越早入队.我们定义点i的入度为di. 假设当前还能删去k条边,那么我们一定会 ...
- 3、HelloKhala示例说明
最简单的dome程序只需3行代码 int main() { //设置端口号 InetAddress listenAddr(USER_PORT); //将端口号绑定到Server NodeServer ...
- C++中使用stringstream简化类型转换
C++标准库中的<sstream>提供了一个stringstream,以前基本没用过,突然发现很好用(^-^)V 参见 http://www.cplusplus.com/reference ...
- android之保存偏好设置信息到shareSharedPreferences,轻量级的保存数据的方法
android之保存偏好设置信息到shareSharedPreferences,轻量级的保存数据的方法 SharedPreferences保存数据到xml文件 有时候要保存activity的某些状 ...
- [Apache系列]怎样在windows下配置apache vhost
找到你的Apache安装目录,下图为小编的Apache安装的目录 2 点击conf文件夹 进入配置目录,找到httpd.conf 文件, 3 打开httpd.conf 文件,如图, 找到地475行, ...