HDU 4923 Room and Moor (单调栈)
题意:
给你一个A数列,让你求一个单调递增的B数列(0<=bi<=1),使得sum{(ai-bi)^2}最小。
思路:
很明显,如果A = 0...01...1,那么bi=ai即可。
可以证明,如果 A = 1...10...0,那么所有bi达到同一个值的时候取得最优值。 假设 ai = 1, aj = 0, 那么 i<j ,所以bi<=bj。 若bi != bj,那么增大bi的值,或者减小bj的值都可以得到更优的结果。 所以,bi=bj。
所以,如果A数列里面出现了形如 "1...10...0"的部分,我们都可以把它当做同一段处理。因为他们对应的bi值一定相同。
这样,我们可以得到一个中间序列,x1, ..., x1, x2, ..., x2, ..., xm, ...xm. 我们可以把它简化为,x1, ..., xm。其中 xi对应着每一段的最优值。
我们可以发现,这里的xi不一定单调递增。 然后我们仿照上面的证明,知道当有相邻两段的xi递减时,会在他们所有的bi相等时取得最优值。因此,我们可以把这两段合并,求出一个满足单调性的值。
所以,最后的B序列一定是这样:y1, ..., y1, ..., ym, ..., ym。所以我们可以用一个单调栈来维护所有的bi值。
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#include <string>
#include <queue>
#include <stack>
#include <vector>
#include <map>
#include <set>
#include <functional>
#include <time.h> using namespace std; typedef pair<double, int> PDI; const int INF = <<;
const int MAXN = (int) 1e5+; int n;
int a[MAXN];
double b[MAXN]; PDI sk[MAXN]; //栈
int tail; //栈顶指针 void solve() {
tail = ; //栈初始化 for (int i = ; i < n; i++) {
sk[tail++] = make_pair(1.0*a[i], ); //当前点入栈
while (tail> && sk[tail-].first<=sk[tail-].first) { //如果栈不满足单调性,合并最上面两个节点
int cnt = sk[tail-].second+sk[tail-].second;
double tmp = (sk[tail-].first*sk[tail-].second+sk[tail-].first*sk[tail-].second)/cnt;
sk[tail-] = make_pair(tmp, cnt);
tail--;
}
}
//求出bi
for (int i = , j = ; i < tail; i++)
for (int k = ; k < sk[i].second; k++)
b[j++] = sk[i].first;
//求出结果
double ans = ;
for (int i = ; i < n; i++)
ans += (a[i]-b[i])*(a[i]-b[i]);
printf("%f\n", ans);
} int main() {
#ifdef Phantom01
freopen("HDU4923.txt", "r", stdin);
#endif //Phantom01 int T;
scanf("%d", &T);
while (T--) {
scanf("%d", &n);
for (int i = ; i < n; i++)
scanf("%d", &a[i]);
solve();
} return ;
}
HDU 4923
HDU 4923 Room and Moor (单调栈)的更多相关文章
- hdu 4923 Room and Moor (单调栈+思维)
题意: 给一个0和1组成的序列a,要构造一个相同长度的序列b.b要满足非严格单调,且 值为0到1的实数.最后使得 sum((ai-bi)^2)最小. 算法: 首先a序列開始的连续0和末尾的连续1是能 ...
- 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 ...
- 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. ...
- HDU 4923 Room and Moor(瞎搞题)
瞎搞题啊.找出1 1 0 0这样的序列,然后存起来,这样的情况下最好的选择是1的个数除以这段的总和. 然后从前向后扫一遍.变扫边进行合并.每次合并.合并的是他的前驱.这样到最后从t-1找出的那条链就是 ...
- HDU - 5033: Building(单调栈 ,求一排高楼中人看楼的最大仰角)
pro:现在在X轴上有N个摩天大楼,以及Q个人,人和大楼的坐标各不相同,保证每个人左边和右边都有楼,问每个人能看到天空的角度大小. sol:不难想到就是维护凸包,此题就是让你模拟斜率优化,此处没有斜率 ...
随机推荐
- 004.ES2015和ES2016新特性--块级作用域变量
其基本原理就是JavaScript的作用域链,下面以对比的方式来展示一下函数级作用域和块级作用域. 函数级作用域 var fns = []; for (var i = 0; i < 5 ; i+ ...
- hiho 1571 - 贪心好题*
题目链接 小Hi在帮助钢铁侠开发新的盔甲.这套新盔甲一共包含M种武器插槽,其中第i种插槽有Ci个.每个插槽最多安装一个武器模块. 小Hi一共准备了N个武器模块,编号1~N.每个武器模块都有三个参数Vi ...
- hiho1560 - 矩阵快速幂
题目链接 坑死了,以为是K进制数,每一位可以是0-K之间的,其实是十进制,每一位最高为9,一直wa在这....... ----------------------------------------- ...
- python3安装xadmin失败
环境win7 旗舰版.python3 使用pip install xadmin命令的时候出现了错误>:\ (⊙o⊙) 解决方法如下: 使用pip download xadmin 现将xadmin ...
- iOS开发——heightForHeaderInSection设置高度无效
iOS11之后,tableView设置section高度失效,解决方法有两种: 1.iOS11默认开启Self-Sizing,关闭Self-Sizing即可.在初始化tableview的地方加上下面的 ...
- Docker学习总结(10)——10分钟玩转Docker
1.前言 进入云计算的时代,各大云提供商AWS,阿里云纷纷推出针对Docker的服务,现在Docker是十分火爆,那么Docker到底是什麽,让我们来体验一下. 2.Docker是什麽 Docker是 ...
- UVA 12003 Array Transformer
Array Transformer Time Limit: 5000ms Memory Limit: 131072KB This problem will be judged on UVA. Orig ...
- ASP.NET-缓存基本知识点
asp.net cache是一种缓存技术,然而,我们在asp.net程序中还可以使用其他的缓存技术,这些不同的缓存也各有所长.由于asp.net cache不能提供对外访问能力,因此,它不可能取代以m ...
- POJ——T 1469 COURSES
http://poj.org/problem?id=1469 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 24197 ...
- Qt之QAbstractButton
简述 QAbstractButton类是按钮部件的抽象基类,提供了按钮所共有的功能. QAbstractButton类实现了一个抽象按钮,并且让它的子类来指定如何处理用户的动作,并指定如何绘制按钮. ...