hdu 4923 Room and Moor [ 找规律 + 单调栈 ]
Room and Moor
Time Limit: 12000/6000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others)
Total Submission(s): 1288 Accepted Submission(s): 416

For each test case:
The first line contains a single integer N (1<=N<=100000), which denotes the length of A and B.
The second line consists of N integers, where the ith denotes Ai.
9
1 1 1 1 1 0 0 1 1
9
1 1 0 0 1 1 1 1 1
4
0 0 1 1
4
0 1 1 1
1.000000
0.000000
0.000000
又一道G++ T,C++ AC 的好题!!!!
题意及题解转自:
http://blog.csdn.net/a601025382s/article/details/38423069
题意:
给定一个长度为n的,由0和1组成的序列ai,求一个序列bi,使得∑(bi-ai)^2最小。其中0<=bi<=1,bi<=b(i+1),bi为浮点型。输出最小的∑(bi-ai)^2的值。
题解:
对于ai序列中,开头的连续0,和结尾的连续1可以省略,因为bi中必定可以赋值连续0和连续1相同的值,使得(bi-ai)^2=0;
对于剩余的序列,我们可以分组,每组为连续1+连续0的形式(例如110010可以分成1100和10)。
对于每个组中的数ai,他们对应的bi必定是相同的。证:假设0对应的bi确定,那么要使∑(bi-ai)^2最小,1对应的bi肯定等于0对应bi中的最小值;同理1对应的bi确定时也一样。之后我们可以发现,这个值正好是rate=num1/(num1+num0),numi表示i的个数。
之后我们遍历每个分组,将每个组压入栈中。在压入栈之前,我们需要判断rate是否呈递增的,若是呈递增的,那么直接要入栈中,因为我们可以两个分组取不同的rate;若不是呈递增,那么我们需要将最后一个组出栈,然后合并,因为我们要保证bi的呈递增的;然后判断这个新的组入栈是否能是栈呈递增,不能则重复前面的动作,直到呈递增或者栈为空为止,之后将新的组压入栈中。
最后得到一个递增的栈,我们直到了每个分组的rate值,那么就能求∑(bi-ai)^2了。
| 13197281 | 2015-03-21 16:21:03 | Accepted | 4923 | 1638MS | 2408K | 2440 B | C++ | czy |
| 13197275 | 2015-03-21 16:20:38 | Time Limit Exceeded | 4923 | 6000MS | 2468K | 2440 B | G++ | czy |
#include <cstdio>
#include <cstring>
#include <stack>
#include <vector>
#include <algorithm> #define ll long long
int const N = ;
int const M = ;
int const inf = ;
ll const mod = ; using namespace std; int n;
double ans;
int aa[N];
int a[N];
int tot;
ll qcnt1[N];
ll qcnt[N];
int T; void ini()
{
ans=;
tot=;
int i,j;
int st,en;
scanf("%d",&n);
for(i=;i<=n;i++){
scanf("%d",&aa[i]);
}
st=;
while(st<=n){
if(aa[st]==){
st++;
}
else{
break;
}
}
if(st==n+) return;
en=n;
while(en>st){
if(aa[en]==){
en--;
}
else{
break;
}
}
j=;
for(i=st;i<=en;i++){
j++;
a[j]=aa[i];
}
tot=j;
//printf(" tot=%d\n",tot);
} void solve()
{
int r;
r=;
ll cnt1,cnt0;
ll cnt;
int i;
int now=;
cnt1=cnt0=;
for(i=;i<=tot;i++){
if(now==){
if(a[i]==){
cnt1++;
}
else{
cnt0++;
now=;
}
}
else{
if(a[i]==){
cnt0++;
}
else{
now=;
cnt=cnt0+cnt1;
while(r!= && qcnt1[r]*cnt > qcnt[r]*cnt1 ){
cnt1+=qcnt1[r];
cnt+=qcnt[r];
r--;
}
r++;
qcnt1[r]=cnt1;
qcnt[r]=cnt;
cnt0=;
cnt1=;
}
}
}
if(now==){
cnt=cnt0+cnt1;
while(r!= && qcnt1[r]*cnt > qcnt[r]*cnt1 ){
cnt1+=qcnt1[r];
cnt+=qcnt[r];
r--;
}
r++;
qcnt1[r]=cnt1;
qcnt[r]=cnt;
}
double te;
//printf(" r=%d\n",r);
while(r!=){
te=1.0*qcnt1[r]/qcnt[r];
ans+=(-te)*(-te)*qcnt1[r]+te*te*(qcnt[r]-qcnt1[r]);
r--;
}
} void out()
{
printf("%.6f\n",ans);
} int main()
{
//freopen("data.in","r",stdin);
scanf("%d",&T);
// for(cnt=1;cnt<=T;cnt++)
while(T--)
//while(scanf("%d",&n)!=EOF)
{
ini();
solve();
out();
}
}
hdu 4923 Room and Moor [ 找规律 + 单调栈 ]的更多相关文章
- HDU 3032 multi-sg 打表找规律
普通NIM规则加上一条可以分解为两堆,标准的Multi-SG游戏 一般Multi-SG就是根据拓扑图计算SG函数,这题打表后还能发现规律 sg(1)=1 sg(2)=2 sg(3)=mex{0,1,2 ...
- HDU 4923 Room and Moor (单调栈)
题意: 给你一个A数列,让你求一个单调递增的B数列(0<=bi<=1),使得sum{(ai-bi)^2}最小. 思路: 很明显,如果A = 0...01...1,那么bi=ai即可. 可以 ...
- hdu 1030 Delta-wave(数学题+找规律)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1030 Delta-wave Time Limit: 2000/1000 MS (Java/Others ...
- HDU 5703 Desert 水题 找规律
已知有n个单位的水,问有几种方式把这些水喝完,每天至少喝1个单位的水,而且每天喝的水的单位为整数.看上去挺复杂要跑循环,但其实上,列举几种情况之后就会发现是找规律的题了= =都是2的n-1次方,而且这 ...
- HDU 4910 Problem about GCD 找规律+大素数判断+分解因子
Problem about GCD Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others ...
- HDU 4572 Bottles Arrangement(找规律,仔细读题)
题目 //找规律,123321123321123321…发现这样排列恰好可以错开 // 其中注意题中数据范围: M是行,N是列,3 <= N < 2×M //则猜测:m,m,m-1,m-1 ...
- HDU 1041 Computer Transformation(找规律加大数乘)
主要还是找规律,然后大数相乘 #include<stdio.h> #include<string.h> #include<math.h> #include<t ...
- HDU 5793 A Boring Question (找规律 : 快速幂+乘法逆元)
A Boring Question Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others ...
- HDU 1391 number steps(找规律,数学)
Starting from point (0,0) on a plane, we have written all non-negative integers 0, 1, 2,... as shown ...
随机推荐
- PMP项目管理学习笔记(7)——整合管理之指导和管理项目执行过程
过程剖析 输入:组织过程资产.企业环境要素.项目管理计划.批准的变更请求 工具:专家判断.项目管理信息系统 输出:工作绩效信息.可交付成果.变更请求.项目文档和计划更新 指导和管理项目执行过程包括: ...
- 工作中Docker使用命令笔记
docker安装与启动 安装docker [root@localhost /]# yum -y install docker-io 更改配置文件 [root@localhost /]# vi /etc ...
- react基础语法(四) state学习
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- 手写MVVM框架 之vue双向数据绑定原理剖析
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- Makeflie自动生成依赖,自动化编译
在netbeans里开发,有一个重要文件makefile,是用来编译所有的文件. 项目的目录结构如下,扁平的目录结构,如何实现自动化编译,写makefile呢? 第一版 基础版: CC = g++ C ...
- mysql 函数tree状
// 子节点的查询 CREATE DEFINER = `root`@`%` FUNCTION `getDeptChildList`(rootId BIGINT) RETURNS longtext DE ...
- swift学习——枚举
swift枚举 1. 枚举基本语法 enum Method { case Add case Sub case Mul case Div } 也可以使用一种更简单的写法 enum Method1{ ca ...
- 数论基础之组合数&计数问题
一.组合数:问题引入:现在有 n 个球,取其中的 k 个球,问一共有多少种方式?答案: 公式直观解释:我们考虑有顺序地取出 k 个球:第一次有 n 种选择,第二次有 n-1 种选择,...,第 k 次 ...
- bzoj3336 Uva10572 Black and White
题目描述: 数据范围:2<=n,m<=8 题解: 很明显需要状压.但是怎么压不知道,压什么不知道. 然后从条件下手. 条件1要求黑色在一起白色在一起,记录轮廓线很容易做到. 条件2要求不能 ...
- Go:反射
一.通过反射获取类型信息 在 Go 程序中,使用 reflect.TypeOf() 函数可以获得任意值的类型对象(reflect.Type),程序通过类型对象可以访问任意值的类型信息. package ...