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 ...
随机推荐
- poj2139 Six Degrees of Cowvin Bacon
思路: floyd 实现: #include <iostream> #include <cstdio> #include <cstring> #include &l ...
- 必看的dockerfile禁忌与建议!
直接上对照组(看第三个run) test1 FROM centos MAINTAINER ** RUN yum -y update RUN yum -y install wget RUN wg ...
- JavaScript也谈内存优化
相对C/C++ 而言,我们所用的JavaScript 在内存这一方面的处理已经让我们在开发中更注重业务逻辑的编写.但是随着业务的不断复杂化,单页面应用.移动HTML5 应用和Node.js 程序等等的 ...
- JAVA自带的加密算法-MD5\SHA1\BASE64
需要导入jar包: commons-codec.jar MD5 String str = "abc"; DigestUtils.md5Hex(str); SHA1 String s ...
- 2019_京东JAVA实习生招聘机试第一题
题意抽象出来就是,求根节点的所有子节点中,以这些子节点为根的子树的最大节点数. 已有向图的方式来保存无向图,所以叶子结点i的eage[i].size()==1. import java.util.Ar ...
- DedeCMS文章标题长度最全修改方法
有时候DedeCMS首页或者其他页面不能全部展示文章标题,造成读者阅读体验差.一般来说标题精简.概括性强.有本文关键词就是一个好标题.写软文不比写“作文”,也不是论坛的标题党,软文是用来做排名的,主要 ...
- 小程序02 wxml和wxss
微信小程序的排版就跟wxml和wxss有关,它们两者相当于HTML和CSS,其中wxml指定了界面的框架结构,而wxss指定了界面的框架及元素的显示样式. 一.wxml 界面结构wxmL比较容易理解, ...
- C++之类成员的访问权限详解(一)
概念解析 众所周知,面向对象编程语言的特征之一就是封装,不同编程语言对于封装提供的实现有所不同,但原理大体上是相同的.C++提供了三种不同程度的访问权限来实现,主要是通过public.private. ...
- python基础知识07-函数作用域和匿名函数
1.匿名函数 list(filter(lamda a:a>3,[1,2,3,4,5])) 一般和过滤器一起使用 2.函数的作用域 a = 123 def test(): a = 666 a = ...
- 如何在Python中显式释放内存?
根据Python官方文档,您可以强制垃圾收集器释放未引用的内存gc.collect().例: import gc gc.collect() 所属网站分类: python高级 > 综合&其 ...