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 ...
随机推荐
- android 防止bitmap 内存溢出
在android开发过程中经常会处理网络图片发送内存溢出,那么怎么解决这种问题? 思路: 下载到本地 通过网络获取和文件下载存放到手机中目录 代码: // 获取网络 public InputStrea ...
- 里特定律 - Little's Law
里特定律(Little's Law)源自排队理论,是IT系统性能建模中最广为人知的定律. 里特定律揭示了前置时间(Lead Time).在制品数量(Work In Progress, WIP)和吞吐率 ...
- 解决jenkins插件列表为空的问题
可能是由于Jenkins的更新网站被QIANG,因此,请使用 http://mirror.xmission.com/jenkins/updates/update-center.json 来进行更新
- Architecture:架构 元素与关系
http://www.iso-architecture.org/42010/cm/ Systems have architectures. In the Standard, the architect ...
- Java面试题之HashSet 的实现原理?
HashSet 的实现原理?首先,我们需要知道它是Set的一个实现,所以保证了当中没有重复的元素.一方面Set中最重要的一个操作就是查找.而且通常我们会选择 HashSet来实现,因为它专门对快速查找 ...
- 基于纯注解的spring开发的介绍
几个核心注解的介绍1.@Configuration它的作用是:将一个java类修饰为==配置文件==,在这个java类进行组件注册1package com.kkb.config; import org ...
- Perl: hash散列转换为Json报错集, perl.c,v $$Revision: 4.0.1.8 $$Date: 1993/02/05 19:39:30 $
bash-2.03$ ./u_json.pl Can't locate object method "encode" via package "JSON" at ...
- KVM中的网络简介(qemu-kvm)
emu-kvm主要向客户机提供了如下4种不同模式的网络: 1)基于网桥(bridge)的虚拟网卡 2)基于NAT(Network Addresss Translation)的虚拟网络 3)QEMU内置 ...
- python3.x Day6 IO多路复用
IO多路复用import asyncio 这个是异步IO模块 这个还不知道怎么用 select poll epoll 都是IO多路复用 windows 仅支持select linux2.6以后 支持e ...
- python中的多任务
多任务 什么是任务 一个电脑运行这的软件 什么是多任务 电脑同时运行着的多个软件 多任务原理 时间片的轮转 并行与并发 并发:假的多任务,多个任务共用一个核 并行:正的多任务,一个核处理一个程序 生理 ...