(翻了翻其他的题解,觉得它们没讲清楚这个策略的正确性)

Problem

洛谷5155

题意概要:给定一个长为\(n\)的序列,可以选择以\(\frac 12\)的概率进行左右移动,也可以结束并得到当前位置上的收益,求从每个位置开始时使用最优策略的最大期望收益是多少

\(n\leq 10^5\)

Solution

关键在于需要考虑当前是选择移动还是直接结束。一个很明了的观点:如果当前移动后的收益期望比当前位置的收益大,那么会选择移动;否则选择直接停止。直接停止的贡献已经知道,那么要求的就是当前点选择移动操作后的收益期望


有一个结论:在长度为\(L\)的数轴上的位置\(x\)处,每次进行左右移动(左右概率都为\(\frac 12\)),若到达\(0\)或\(L\)即停止,则到达\(0\)停止的概率为\(\frac {L-x}L\),到达\(L\)停止的概率为\(\frac xL\)

关于这个结论的证明,考虑设在 \(i\) 开始,到\(L\)停止的概率为\(f_i\),由题可得\(f_i=\frac {f_{i-1}+f_{i+1}}2\),不难发现这个方程是等差数列的描述,又由\(f_0=0,f_L=1\)可得\(f_i=\frac xL\),即可得到上面的结论

这个结论的用处后面再说


假设我们已知一些节点移动的期望收益比当前点停止的收益低,即如果进行随机游走,一旦到达这些点,一个极端聪明的人是绝不会继续移动的,设这些点为停止点

会发现,如果从 \(i\) 出发进行移动,那么移动的期望收益一定是由 \(i\) 往前数第一个停止点和往后数第一个停止点贡献的

不妨设为 \(a\) 和 \(b\),由我们之前的结论可以得到到达 \(a\) 停止的概率为\(\frac {b-i}{b-a}\),到达 \(b\) 停止的概率为\(\frac {i-a}{b-a}\),由期望公式可得从 \(i\) 出发进行随机移动的期望收益为 \(E=v_a\cdot \frac {b-i}{b-a}+v_b\cdot \frac {i-a}{b-a}\),比划一下会发现这是满足物理里的杠杆模型的

现在我们得到了一个优秀的做法,就是对于每个点,找到其前后的第一个停止点,得到其移动的期望收益然后与自己的停止收益取最大值


但如何求出所有的停止点呢?

进一步,画个图可知,设 \(a\) 坐标为 \((a,v_a)\),\(b\) 坐标为 \((b,v_b)\),则从 \(i\) 出发进行移动的期望收益是 \(a,b\) 所连线段与直线\(x=i\)的交点纵坐标,所有的停止点会满足在\(x=i\)时,\(v_i\)要比这条线段要高

不难发现若将所有停止点 \((i,v_i)\)画出来一定成为一个凸包,反证法证明:若存在一个停止点在凸包内,则这个点的移动期望比停止期望大,也就是说这并不是一个停止点,与假设相悖,得证

所以为了得到所有的停止点,只要对所有的\((i,v_i)\)求个凸包即可

证明真有趣

Code

#include <bits/stdc++.h>
typedef long long ll; inline void read(ll&x){
char c11=getchar();x=0;while(!isdigit(c11))c11=getchar();
while(isdigit(c11))x=x*10+c11-'0',c11=getchar();
} const int N=101000,bs=1e5;
int n,tp; struct vec{
int x;ll y;
inline vec(){}
inline vec(const int&X,const ll&Y):x(X),y(Y){}
friend inline vec operator - (const vec&A,const vec&B) {return vec(A.x-B.x,A.y-B.y);}
friend inline ll operator * (const vec&A,const vec&B) {return A.x*B.y-A.y*B.x;}
}p,st[N]; void push(vec p){
while(tp&&(p-st[tp])*(st[tp]-st[tp-1])<=0)--tp;
st[++tp]=p;
} int main(){
scanf("%d",&n);vec p;
for(int i=1;i<=n;++i)p.x=i,read(p.y),p.y*=bs,push(p);
push(vec(n+1,0));
for(int i=1,j=0;i<=n;++i){
while(j<tp&&st[j].x<i)++j;
if(st[j].x==i)printf("%lld\n",st[j].y);
else printf("%lld\n",((st[j].x-i)*st[j-1].y+(i-st[j-1].x)*st[j].y)/(st[j].x-st[j-1].x));
}return 0;
}

题解-USACO18DEC Balance Beam详细证明的更多相关文章

  1. 题解 [USACO18DEC]Balance Beam

    被概率冲昏的头脑~~~ 我们先将样例在图上画下来: 会发现,最大收益是: 看出什么了吗? 这不就是凸包吗? 跑一遍凸包就好了呀,这些点中,如果i号点是凸包上的点,那么它的ans就是自己(第二个点),不 ...

  2. Luogu5155 [USACO18DEC]Balance Beam

    题目链接:洛谷 这道题看起来是个期望题,但是其实是一道计算几何(这种题太妙了) 首先有一个很好的结论,在一个长度为$L$的数轴上,每次从$x$处出发,不停地走,有$\frac{x}{L}$的概率从右端 ...

  3. 洛谷P5155 [USACO18DEC]Balance Beam(期望,凸包)

    你以为它是一个期望dp,其实它是一个凸包哒! 设平衡木长度为\(L\),把向右走平衡木那个式子写一下: \[dp[i]=\frac{dp[i+1]+dp[i-1]}{2}\] 然后会发现这是一个等差数 ...

  4. [USACO18DEC]Balance Beam

    题目链接:这里 或者这里 答案是很显然的,记\(g(i)\)为在\(i\)下平衡木时的期望收益 那么\(g(i)=max(f(i),\frac{g(i-1)+g(i+1)}{2})\) 好了做完了 T ...

  5. Luogu5155 USACO18DEC Balance Beam(概率期望+凸包)

    假设已经求出了在每个点的最优期望收益,显然最优策略是仅当移动一次后的期望收益>当前点收益时移动.对于初始点,其两边各存在一个最近的不满足上述条件的位置,因此从初始点开始随机游走,直到移动到这两个 ...

  6. p5155 [USACO18DEC]Balance Beam

    传送门 分析 https://www.luogu.org/blog/22112/solution-p5155 代码 #include<bits/stdc++.h> using namesp ...

  7. [USACO18DEC]Balance Beam P

    根据题意不难发现这个模型是不好进行贪心的,于是可以考虑使用 \(dp\).可以令 \(dp_i\) 表示在 \(i\) 位置以最优策略能获得的报酬期望值,那么会有转移: \[dp_i = \max(f ...

  8. Android Beam 详细实现步骤

    前言 最近没怎么写东西了,主要是在了解Beam这个东东.这方面的教程真的非常有限,找了不少资料目前还没看到一篇能够让一个新手看一遍就知道实现一个Beam功能都需要那些步骤的.而且,都是用的官方的例子, ...

  9. 题解-USACO18DEC Sort It Out

    Problem 洛谷5156 题意概要:给定一个长为\(n\)的排列,可以选择一个集合\(S\)使这个集合内部元素排到自己在整个序列中应该在的位置(即对于集合\(S\)内的每一个元素\(i\),使其排 ...

随机推荐

  1. JAVA核心技术I---JAVA基础知识(异常处理类)

    一:异常分类 Throwable:所有错误的祖先. Error:系统内部错误或者资源耗尽.不用我们管 Exception: 程序有关的异常.重点关注 –RuntimeException: 程序自身的错 ...

  2. python css功能补充讲解

    ###########总结#### 标签选择器 标签名     id选择器  #box1   类选择器.box2 css高级选择器 *子选择器* 子选择器用 大于号 .box1>.box2{ w ...

  3. angular中的服务

    angular中的服务 angular中的服务相当于一个状态管理,可以将数据放在服务里面进行获取以及编辑. 服务的安装命令: ng g service count 安装好后,会在服务的ts文件中引入一 ...

  4. solrj管理索引库

    solrj管理索引库 1.1. 什么是solrJ solrj是访问Solr服务的java客户端,提供索引和搜索的请求方法,SolrJ通常在嵌入在业务系统中,通过SolrJ的API接口操作Solr服务, ...

  5. Hadoop 博文整理

    参考文章##搭建 使用yum安装CDH Hadoop集群   http://blog.javachen.com/2013/04/06/install-cloudera-cdh-by-yum/   Ha ...

  6. vue插件 使用use注册Vue全局组件和全局指令

    插件一般会注册到全局使用 官方编辑插件介绍:https://vuefe.cn/v2/guide/plugins.html 全局组件: .首先建一个自定义组件的文件夹,比如叫loading,里面有一个i ...

  7. PHP实现权限管理功能

    权限管理系统,它主要是为了给不同的用户设定不同的权限,从而实现不同权限的用户登录之后使用的功能不一样. 首先先看下数据库 总共有5张表,users,roles和roleswork 3张表与另外2张表形 ...

  8. faster rcnn相关内容

    转自: https://zhuanlan.zhihu.com/p/31426458 faster rcnn的基本结构 Faster RCNN其实可以分为4个主要内容: Conv layers.作为一种 ...

  9. nginx 基于uwsgi部署Django

    1.安装nginx yum install -y nginx(需要epel源) 2.安装环境 可以考虑使用虚拟化环境,本处不再使用 3.安装uwsgi yum groupinstall "D ...

  10. CentOS7.2通过Yum安装MySQL5.7

    1 下载源 wget http://dev.mysql.com/get/mysql57-community-release-el7-8.noarch.rpm 2安装源 yum localinstall ...