题解:[COCI2011-2012#5] BLOKOVI
题解:[COCI2011-2012#5] BLOKOVI
Description
PDF : https://hsin.hr/coci/archive/2011_2012/contest5_tasks.pdf
题意:
有 \(N\) 个已知质量的矩形,长都是 2 ,高都是 \(h\) 。把它们放到一个平面直角坐标系里,满足:
- 各矩形的边与坐标轴平行;
- 各矩形下底边的纵坐标各不相同,分别为 \(0,h,2h,\dots,(N-1)h\) ;
- 最底端的矩形左下角坐标恒为 \((-2,0)\) ,右下角为原点 \((0,0)\) 。
我们记一个矩形的 \(Xcentre\) 为其下底边的中点,
一个或多个矩形的 \(Xbarycentre\) 是这些矩形的 \(Xcentre\) 的加权平均数,公式为:
\]
其中 \(m_i\) 是各个矩形的质量。
如果 \(N\) 的矩形的摆放方案是稳定的,它应当满足对于任意的矩形 \(A\) ,在 \(A\) 上方的各矩形的 \(X-barycentre\) 符合 \(|Xbarycentre - Xcentre(A)| \leq 1\) 。

左图的摆放方案就是不稳定的,因为最上方两个矩形的 \(Xcentre\) 距离落在的下面那个矩形的右侧。
右图的的拜访方案则是稳定的。
现在我们给出从下至上各个矩形的质量,在保证摆放方案稳定的情况下,请你找出所有矩形右下角顶点的横坐标最大值可能是多少。
注意,你不能改变矩形的摆放顺序和第一个矩形的位置。
\(2\leq N \leq 3e5\)
至今,我仍然无法用自然流畅的语言翻译英文题面……大家姑且一看,建议还是读原题。
Algorithm
太神了,我只能说不愧是克罗地亚题。
首先, \(N\leq3e5\) 的规模要求了一个线性的算法,这似乎是比较困难的。
为什么呢?我们自底而上地考虑,考虑放置某个矩形的时候,未来放置的其它矩形很可能会影响它的放置。
换言之,我们需要「回头」。
说到「回头」,我们很容易想到动态规划中「后效性」的概念。
而这道题正是一个 多阶段决策最优化问题 。我们不妨就试着消除后效性,使用动态规划来解决它。
试着消除本题的后效性是一件并不困难的问题。只需要回顾刚刚我们需要「回头」的情形,很容易就能发现:
任何一个矩形的放置方法只可能影响在它之下的矩形放置。
当然上面矩形的绝对坐标也会受到影响,但是相对位置并不会发生变化。
因此,我们当然可以自顶向下地考虑各个矩形的放置,这样就自然可以消除后效性了。
当然,题目还要求最底下的那个矩形的位置固定,因此我们需要将自顶向下考虑得到的相对坐标转化为答案要求的绝对坐标。
既然后效性没了,那么接下来,我们考虑动态规划的状态转移。
我们在这里仍然存在一个小小的问题:
我们是在一个笛卡尔坐标系上放矩形,可以放置的位置可是有不可数无穷多个啊。
直觉敏感的同学或者勇敢莽撞的同学一定发现了:我们只要往最左边或者最右边放就行了。
这点是容易感性地证明的:
考虑不是把某个矩形放在最左或最右的情况,将其与其下的矩形在不改变其相对位置的情况下、整体地左移或右移,一定可以使得答案不变得更劣。
这句话稍稍有点复杂,不过其意涵是比较容易理解的。
每个矩形能放置的极限位置也是容易计算的。我们先计算向右放最远能放多少。
记
&d_k = Xcentre(k) - Xbarycentre(k + 1\sim n) \leq 1
\end{align*}
\]
由定义又有:
\]
其中,
\]
然后一个带入,
\]
按照上述分析,直接取 \(d_k = 1\) ,那么放置导致的重心向右偏移量即为 \(\Large \frac{m_k}{\sum_{i = k}^n m_i}\) 了。
由对称性,向左放最大偏移量即为 \(2 - \Large \frac{m_k}{\sum_{i = k}^n m_i}\) 。
接下来我们只要顺次考虑某个矩形是放在最左还是最右即可了,这是一个类似 01背包的模型。
代码很简单:
#include<bits/stdc++.h>
using namespace std;
template<class T>
inline void read(T &x)
{
char c = getchar(); x = 0;
while(c < '0' || '9' < c) c = getchar();
while('0' <= c && c <= '9')
{
x = (x << 1) + (x << 3) + c - 48;
c = getchar();
}
}
const int N = 3e5 + 10;
int n, a[N];
int main()
{
read(n);
for(int i = 1; i <= n; read(a[i++]));
double ans = 0, sum = 0;
for(int i = n; i > 1; --i)
{
sum += a[i];
double del = a[i] / sum;
ans = max(ans, max(ans + del, 2 - del));
}
printf("%.8f\n", ans);
return 0;
}
题解:[COCI2011-2012#5] BLOKOVI的更多相关文章
- NOIP 2012 Day2T2 借教室题解
NOIP 2012 Day2T2 借教室题解 题目传送门:http://codevs.cn/problem/1217/ 题目描述 Description 在大学期间,经常需要租借教室.大到院系举办活动 ...
- 【题解】Ples [COCI2011]
[题解]Ples [COCI2011] 依旧是没有传送门,只有提供了数据的官网. [题目描述] \(N\) 个汉子和 \(N\) 个妹纸一起参加舞会,跳舞时只能是一个汉子一个妹纸配对,现在给出每个人的 ...
- 【题解】Dvoniz [COCI2011]
[题解]Dvoniz [COCI2011] 没有传送门,只有提供了数据的官网. [题目描述] 对于一个长度为 \(2*K\) 的序列,如果它的前 \(K\) 个元素之和小于等于 \(S\) 且后 \( ...
- 网易游戏QA工程师笔试回忆-2012.9【个人题解】
========================转帖======================== 网易游戏QA工程师笔试回忆-2012.9 刚刚从武大回来,趁热回忆下题目,给以后的XDJMs参考. ...
- 【2012天津区域赛】部分题解 hdu4431—4441
1001: 题意:给你13张麻将牌,问可以胡哪些张 思路: 枚举可能接到的牌,然后dfs判断能否胡 1002: 题意: 已知n,m 求 n的所有约数在m进制下的平方和 做法:队长用java高精度写的 ...
- 【2012长春区域赛】部分题解 hdu4420—4430
这场比赛特点在于两个简单题太坑,严重影响了心情..导致最后只做出两题....当然也反映出心理素质的重要性 1002: 题意:一个矩阵b[n][n]通过数组 a[n]由以下规则构成,现在已知b[n][n ...
- ACM-ICPC Dhaka Regional 2012 题解
B: Uva: 12582 - Wedding of Sultan 给定一个字符串(仅由大写字母构成)一个字母表示一个地点,经过这个点或离开这个点都输出这个地点的字母) 问: 每一个地点经过的次数(维 ...
- 【USACO 2012 Open】奶牛赛跑_题解
奶牛赛跑 目录 奶牛赛跑 题目描述 输入格式 输出格式 样例 样例输入#1 样例输出#1 题解 代码 题目描述 约翰有头奶牛,他为这些奶牛准备了一个周长为的环形跑牛场.所有奶牛从起点同时起跑,奶牛在比 ...
- Luogu P1082 同余方程(NOIP 2012) 题解报告
题目传送门 [题目大意] 求关于x的同余方程 ax≡1(mod b)的最小整数解. [思路分析] 由同余方程的有关知识可得,ax≡1(mod b)可以化为ax+by=1,此方程有解当且仅当gcd(a, ...
随机推荐
- [PyTorch 学习笔记] 6.2 Normalization
本章代码: https://github.com/zhangxiann/PyTorch_Practice/blob/master/lesson6/bn_and_initialize.py https: ...
- python基础:多进程、多线程
一.定义和区别 1.一个任务就是一个进程,进程就是资源的集合.比如打开浏览器,启动一个进程.当一个进程需要干很多事的时候,就需要执行多个子任务,这些子任务就是线程. 2.线程是包含在进程中的,每个进程 ...
- 第一次编程作业(My Own Score)
博客班级 https://edu.cnblogs.com/campus/fzzcxy/2018SE2 作业要求 https://edu.cnblogs.com/campus/fzzcxy/2018SE ...
- 【微信小程序】常用组件及自定义组件
(一) 常用标签 组件你可以理解为传统页面开发时候的各种标签,例如 div span 等等,我这里只说一些常用的,这样就能能搭建出一个基本的页面了,但是如果想要更加美观以及拥有更好的体验,就需要 XS ...
- [LeetCode]面试题62. 圆圈中最后剩下的数字(数学)
题目 0,1,,n-1这n个数字排成一个圆圈,从数字0开始,每次从这个圆圈里删除第m个数字.求出这个圆圈里剩下的最后一个数字. 例如,0.1.2.3.4这5个数字组成一个圆圈,从数字0开始每次删除第3 ...
- 如何在项目中使用composer的相关功能
最近要在公司的magento项目中引用第三方库,用了composer来进行管理,composer还是非常方便的: 1.在应用的根目录下添加文件:composer.json { "nam ...
- Salesforce Javascript(一) Promise 浅谈
本篇参看: https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Promise https ...
- 【Java并发编程】从CPU缓存模型到JMM来理解volatile关键字
目录 并发编程三大特性 原子性 可见性 有序性 CPU缓存模型是什么 高速缓存为何出现? 缓存一致性问题 如何解决缓存不一致 JMM内存模型是什么 JMM的规定 Java对三大特性的保证 原子性 可见 ...
- J.U.C之Executor框架入门指引
1.Executor接口 This interface provides a way of decoupling task submission from the mechanics of how e ...
- PyCharm专业版编辑器安装(含破解步骤)
一.首先下载好安装包: 二.安装步骤: 1.双击安装包,打开安装界面,点击"next": 2.选择安装路径,点击"next": 3.电脑是64位的就勾选64-b ...