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 ...
随机推荐
- 014、BOM与DOM对象的应用
Screen屏幕对象 Width:屏幕的宽度 Height:屏幕的高度 availWidth:屏幕的有效宽度(不含任务栏) availHeight:屏幕的有效高度(不含任务栏) colorDepth: ...
- PE刷题记
PE 中文翻译 最喜欢做这种很有意思的数学题了虽然数学很垃圾 但是这个网站的提交方式好鬼畜啊qwq 1.Multiples of 3 and 5 直接枚举 2.Even Fibonacci numbe ...
- 基于 Web 的 Go 语言 IDE - Wide 1.5.0 发布!
Wide 是什么 Wide 是一个基于 Web 的 Go 语言团队 IDE. 在线开发:打开浏览器就可以进行开发.全快捷键 智能提示:代码自动完成.查看表达式.编译反馈.Lint 实时运行:极速编译. ...
- Intro Of Myself
- C语言中函数参数传递的本质是值传递
数组名做函数参数进行传递时,实际上是是一份该指针的拷贝. 给形参赋予其他值,并不影响实参的值. 类似于: int *p = a; //a为数组名 p = b; //b为数组名 ...
- HTTP请求头的具体含意
为你详细解读HTTP请求头的具体含意 | 浏览:5763 | 更新:2012-03-16 16:41 当我们打开一个网页时,浏览器要向网站服务器发送一个HTTP请求头,然后网站服务器根据HTTP请求头 ...
- 35个Redis面试题
1.什么是redis? Redis 是一个基于内存的高性能key-value数据库. 2.Reids的特点 Redis本质上是一个Key-Value类型的内存数据库,很像memcached,整个数据库 ...
- L2-2 社交集群 (25 分)(一个写挫的并查集)
题目: 思路: 就是一个并查集的裸题,不过在数据查找方面可能不好处理,暴力完全可以解决这个问题啊!! #include <bits/stdc++.h> #include <cstdi ...
- 简单DP内容
1. 最长上升子序列 [题目描述] 给定N个数,求这N个数的最长上升子序列的长度. [样例输入] 7 2 5 3 4 1 7 6 [样例输出] 4 第一种解法:时间复杂度O(n^2), 状态设计:DP ...
- MySQL存储过程实践
对employees数据库建立存储过程 创建不含有输入输出变量的存储过程 DELIMITER // -- 设定语句结束分隔符 DROP PROCEDURE IF EXISTS GetEmployees ...