题意:

给一个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. UVA 10198 Counting

    Counting The Problem Gustavo knows how to count, but he is now learning how write numbers. As he is ...

  2. C# byte[]与char[]、string与char[]、byte[] 与 string 互转

    1. byte array -> char array Byte[] b=new byte[5]{0x01,0x02,0x03,0x04,0x05};  Char[] c=Encoding.AS ...

  3. 安卓状态栏通知Status Bar Notification

    安卓系统通知用户三种方式: 1.Toast Notification 2.Dialog Notification 3.Status Bar Notification Status Bar Notifi ...

  4. Geodatabase - 打开数据库(工作空间)

    //使用IName方式打开数据库(工作空间). public void GetWorkspace_IName(string workspacePath) { ESRI.ArcGIS.Geodataba ...

  5. css实现超连接按钮形式显示

    <html> <head> <meta http-equiv="Content-Type" content="text/html; char ...

  6. hdu Phone List

    Problem Description Given a list of phone numbers, determine if it is consistent in the sense that n ...

  7. c#快捷键设置和text输入限制

    快捷键 使用KeyDonw事件 输入限制使用 KeyPress 事件 1.注意:如果是整个窗体的快捷键,一定要把窗体属性中的KeyPreview改为true private void textbox_ ...

  8. encodeURI后台乱码(解决)

    window.location.href = xxxx?a=encodeURI(encodeURI(name)) ; name是中文,页面部分需要编码两次 name = java.net.URLDec ...

  9. js 16进制字符串互转

    /** * 16进制转换为字符串 * @param hex * @returns {*} */ function hexToString(hex) { var tmp = ''; if (hex.le ...

  10. Tempter of the Bone--hdu1010--zoj2110

    Tempter of the Bone Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Othe ...