Luogu5155 [USACO18DEC]Balance Beam
题目链接:洛谷
这道题看起来是个期望题,但是其实是一道计算几何(这种题太妙了)
首先有一个很好的结论,在一个长度为$L$的数轴上,每次从$x$处出发,不停地走,有$\frac{x}{L}$的概率从右端点掉下去,$\frac{L-x}{L}$从左端点掉下去。
这个证明的话,感性理解一下。
令$l_x$表示从$x$处掉到左端点的概率,则$l_0=1,l_L=0$,且对于$x\in (0,L)$,$l_x=\frac{l_{x-1}+l_{x+1}}{2}$,所以$l_x$构成一个等差数列,所以得证。
显然,我们肯定是不能一直走的,不然得分肯定是0,但是我们可以“掉进”一些权值比较高的点使得答案最优,我们称这些点为“停止点”。
设从$x$处出发。
如果$x$本身就是“停止点”,那么答案就是$f_x$。($f_x$为这个点的权值)
否则$x$左右两侧的最近的“停止点”为$a,b$,这种策略的答案为$f_a*\frac{b-x}{b-a}+f_b*\frac{x-a}{b-a}$
我们发现它就是$(a,f_a),(b,f_b)$两点连接的线段在$x$处的$y$值。
所以我们维护对$(x,f_x)(x\in [0,n+1])$这$n+2$个点计算出上凸包,然后就是直接贪心计算了。
#include<cstdio>
#define Rint register int
using namespace std;
typedef long long LL;
const int N = ;
struct Point {
LL x, y;
inline Point operator - (const Point &o) const {return (Point){x - o.x, y - o.y};}
inline LL operator * (const Point &o) const {return x * o.y - y * o.x;}
} p[N];
int n, top;
LL a[N];
inline void push(Point now){
while(top > && (now - p[top - ]) * (p[top] - p[top - ]) < ) -- top;
p[++ top] = now;
}
int main(){
scanf("%d", &n);
for(Rint i = ;i <= n + ;i ++){
if(i && i <= n) scanf("%lld", a + i), a[i] *= ;
push((Point){i, a[i]});
}
int now = ;
for(Rint i = ;i <= n;i ++){
while(p[now].x < i) ++ now;
if(p[now].x == i) printf("%lld\n", p[now].y);
else {
printf("%lld\n", (LL) (1.0 * ((i - p[now - ].x) * p[now].y + (p[now].x - i) * p[now - ].y) / (p[now].x - p[now - ].x)));
}
}
}
Luogu5155
Luogu5155 [USACO18DEC]Balance Beam的更多相关文章
- Luogu5155 USACO18DEC Balance Beam(概率期望+凸包)
假设已经求出了在每个点的最优期望收益,显然最优策略是仅当移动一次后的期望收益>当前点收益时移动.对于初始点,其两边各存在一个最近的不满足上述条件的位置,因此从初始点开始随机游走,直到移动到这两个 ...
- 洛谷P5155 [USACO18DEC]Balance Beam(期望,凸包)
你以为它是一个期望dp,其实它是一个凸包哒! 设平衡木长度为\(L\),把向右走平衡木那个式子写一下: \[dp[i]=\frac{dp[i+1]+dp[i-1]}{2}\] 然后会发现这是一个等差数 ...
- [USACO18DEC]Balance Beam
题目链接:这里 或者这里 答案是很显然的,记\(g(i)\)为在\(i\)下平衡木时的期望收益 那么\(g(i)=max(f(i),\frac{g(i-1)+g(i+1)}{2})\) 好了做完了 T ...
- 题解-USACO18DEC Balance Beam详细证明
(翻了翻其他的题解,觉得它们没讲清楚这个策略的正确性) Problem 洛谷5155 题意概要:给定一个长为\(n\)的序列,可以选择以\(\frac 12\)的概率进行左右移动,也可以结束并得到当前 ...
- p5155 [USACO18DEC]Balance Beam
传送门 分析 https://www.luogu.org/blog/22112/solution-p5155 代码 #include<bits/stdc++.h> using namesp ...
- 题解 [USACO18DEC]Balance Beam
被概率冲昏的头脑~~~ 我们先将样例在图上画下来: 会发现,最大收益是: 看出什么了吗? 这不就是凸包吗? 跑一遍凸包就好了呀,这些点中,如果i号点是凸包上的点,那么它的ans就是自己(第二个点),不 ...
- [USACO18DEC]Balance Beam P
根据题意不难发现这个模型是不好进行贪心的,于是可以考虑使用 \(dp\).可以令 \(dp_i\) 表示在 \(i\) 位置以最优策略能获得的报酬期望值,那么会有转移: \[dp_i = \max(f ...
- bzoj5483: [Usaco2018 Dec]Balance Beam
又又又又又又又被踩爆了 首先容易写出这样的期望方程:f(1)=max(d(1),f(2)/2),f(n)=max(d(n),f(n-1)/2), f(i)=max(d(i),(f(i-1)+f(i+1 ...
- 当PsychicBoom_发觉自己是个大SB的时候……
这些题都是没ac调了好久发现是sb错误的题--. 想清楚再写题!!! 2019.4.18 洛谷P5155 [USACO18DEC]Balance Beam 转移方程\((a[l[i]]*(r[i]-i ...
随机推荐
- linux 系统调用sysconf【总结】
1.前言 当前计算机都是多核的,linux2.6提供了进程绑定cpu功能,将进程指定到某个core上执行,方便管理进程.linux提供了sysconf系统调用可以获取系统的cpu个数和可用的cpu个数 ...
- 做GUI的随笔
用的SDL库 官方网站是:https://littlevgl.com/ 改网站需要FQ 字库制作网站: https://debugdump.com/t_771.html
- PHP之static静态变量详解
在看别人项目过程中,看到函数里面很多static修饰的变量,关于static修饰的变量,作用域,用法越看越困惑,所以查了下资料. static用法如下: 1.static 放在函数内部修饰变量 2.s ...
- springboot配置文件priperties大全
flyway.baseline-description 执行基线时标记已有Schema的描述. flyway.baseline-on-migrate 在没有元数据表的情况下,针对非空Schema执行迁 ...
- LinkedList阅读
package java.util; import java.util.function.Consumer; public class LinkedList<E> extends Abst ...
- 饮冰三年-人工智能-Python-18Python面向对象
1 类与实例对方法和属性的修改 class Chinese: # 这是一个Chinese的类 #定义一个类属性,又称为静态数据或者静态变量,相当于C#中的static country="Ch ...
- Service-Level Agreement (服务水平协议)
Service-Level Agreement (服务水平协议) SLA是为负载测试场景定义的具体目标.例如,评测脚本中任意数量事务的平均响应时间,可以定义具体的目标或阈值.测试运行结束之后,Load ...
- sybase central 报 NullPointerException 解决
准备发布版本,但是要创建数据库的时候遇到了问题,发现之前可以正常打开的sybase Central 现在无法打开了.苦恼一段时间后找到如下解决方法. 报错如下: 解决如下: 正常打开:
- JS对象2
1.Date对象 创建对象 //方法1:不指定参数 var nowd1=new Date(); alert(nowd1.toLocaleString( )); //方法2:参数为日期字符串 var n ...
- vue-countTo---简单好用的一个数字滚动插件
vue-countTo是一个无依赖,轻量级的vue组件,可以自行覆盖easingFn. 你可以设置 startVal 和 endVal,它会自动判断计数或倒计时.支持vue-ssr.vue-count ...