[The 2019 Asia Yinchuan First Round Online Programming] D Take Your Seat
\(\mathcal{Description}\)
题目大意
该题目有两个问题
\(Task\ 1\),有\(n\)个人\(n\)个座位,每个人都有一个对应的座位,每个人排队进入去坐座位,小\(A\)是第一个,然而小\(A\)忘记了自己的位置,于是他进去后自己随便坐了一个位置,之后的人进来后若发现自己的位置已经被人坐了,那么他就也会随便坐一个没人坐的位置,如果自己的位置没有被人坐,那么就会坐自己的位置,问最后一个进来的人坐到自己的位置的概率是多少
\(Task\ 2\),有\(m\)个人\(m\)个座位,该问题与上面问题差不多,但是每个人并不会排队进去,而是随机的进入,即进入的顺序是随机的(包括小\(A\)的进入时间),仍然问最后一个进来的人坐到自己的位置的概率是多少
复杂度要求在\(O(n^3)\)以内
实际上只要\(O(1)\)
\(\mathcal{Solution}\)
这题有点考思维,博主想了很久(博主太蒻了),所以会写一些心得,在引用里面,只想知道题解可以跳过
主要是考逆向思维,以及一个问题的转化
不要怕概率这个玩意,尽量想办法避开它,或者只用最简单的概率计算
考虑递推
想了很久如何正着推,但是不知道某个人进来时是否可以坐座位,设了很多方程,都是找不到转移或者错误的转移
一般递推都会是可以将某一个状态变成另一个状态
所以我们要找到什么样的状态是有联系的
\(Task\ 1\)
一直想找到一种方法可以考虑到一个座位是否被坐,博主突然发现了一个性质
我们知道,当小\(A\)坐在了第\(x\)个进来的人的位置,那么第\(2\)到\(x-1\)个人进来时都是直接坐在自己座位上
这条性质十分显然也十分简单,可是却很容易将其忽视博主忽视了1个多小时...
另外,小\(A\)坐在任何一个位置的概率都是\(\frac{1}{n}\)
于是我们可以利用这样的两个性质,开始递推
我们不认为小\(A\)是忘记了自己的座位,而是不知道自己的座位设\(f[i]\)表示有\(i\)个人时,第一个人不知道自己座位(即第一个人会乱坐)的答案
当小\(A\)坐在了自己的座位上时,之后最后一个人坐在自己座位的概率为\(100\%\)
当小\(A\)坐了第\(j\)个人的座位时,当第\(j\)个人来找座位时,我们可以认为原本小\(A\)的座位是他的座位,而他不知道
因为当他坐在小\(A\)的座位上时,对后面上来的人都没有影响了
这样,若小\(A\)坐了\(j\)号座位,当\(j\)来找座位时,相当于是考虑原来的问题,只不过\(n\)变成了\(n-j+1\)
于是我们得到了这样的递推式
\(\begin{aligned}f[i]=\frac{1}{i}\sum_{j=1}^{i-1}f[j]\end{aligned}\)
初值\(f[1]=1\)
上面这个式子可以记一下前缀和然后就可以\(O(1)\)转移了然后博主发现从\(2\)开始,答案都是\(\frac{1}{2}\)
\(Task\ 2\)
由于是完全随机的顺序,所以没有了上面那个性质在想出来\(Task\ 1\)的做法后,博主坚信一定是递推,但是又想了一会没想出来
在内心坚定自己时欧皇的情况下,博主毅然蒙了两个结论提交了程序,于是博主就多了两个罚时...
因为已经想出来第一问,博主舍不得,于是博主就继续肝了一会儿,又有了一个想法仍然是考虑递推,受到\(Task\ 1\)的启发,所以仍然按照这个思维模式
因为是随机顺序,所以小\(A\)是第几个来坐座位的概率都是\(\frac{1}{m}\)
设\(f[i]\)表示有\(i\)个人的答案
因为不知道座位是一种特殊的状态,所以我们仍然对它下手
考虑小\(A\)是第\(j\)个来坐座位的人
这样前\(j-1\)个人都是坐在自己座位上
于是现在要考虑的就是有\(i-j+1\)个人,小\(A\)第一个来坐座位,剩下的人是随机来坐座位的情况
设\(g[i]\)表示有\(i\)个人,小\(A\)第一个来坐座位,剩下的人是随机来坐座位,最后一个人坐到自己座位上的答案
然后我们枚举小\(A\)是第几个
得到这样的递推式
\(\begin{aligned}f[i]=\frac{1}{i}\sum_{j=1}^{i}g[i]\end{aligned}\)
于是现在就是要想办法求\(g\)了,终于把问题转化为一个感jio简单些的问题了考虑求\(g[i]\),我们仍然按照上面的思维模式,考虑小\(A\)坐在了第\(j\)个来选座位的人的座位
因为是随机顺序,所以小\(A\)随便坐一个位置,其是第\(j\)(\(j\)任取)个上来的人的座位的概率仍然是\(\frac{1}{i}\)
于是,在\(j\)前面的人都坐自己的位置,从\(j\)开始,又是一个\(i-j+1\)个人的问题,当然,别忘了坐在自己坐
所以得到\(g\)的递推式
\(\begin{aligned}g[i]=\frac{1}{i}\sum_{j=1}^{i-1}g[i]\end{aligned}\)诶,这个和\(Task\ 1\)的\(f\)是一样的.....
于是问题就得到了解决
真是可喜可贺可喜可贺...
噢,这还只是\(O(n)\)是吧
然后我们经过打表发现
对于\(Task\ 1\)
有\(f[1]=1,f[n]=0.5(n>1)\)
然后对于\(Task\ 2\)
有\(g[m]=\frac{m+1}{2m}\)
\(\mathcal{Code}\)
这里仍然给了\(f,g\)的递推(以免有不太明白的地方),但是直接用上面的结论\(O(1)\)输出的
/*******************************
Author:Morning_Glory
LANG:C++
Created Time:2019年08月31日 星期六 15时45分43秒
*******************************/
#include <cstdio>
#include <fstream>
using namespace std;
const int maxn = 55;
const int mx = 50;
int T,n,m;
double sum;
double f[maxn],g[maxn];
void init ()
{
sum=g[1]=f[1]=1,f[2]=1.0/2.0;
for (int i=2;i<=mx;++i) f[i]=1.0/i*sum,sum+=f[i],g[i]=sum/(double)i;
}
int main()
{
scanf("%d",&T);
init();
for (int t=1;t<=T;++t){
scanf("%d%d",&n,&m);
printf("Case #%d: %.6lf %.6lf\n",t,n>1?0.5:1,(double)(m+1)/(double)(2.0*m));
}
return 0;
}
如有哪里讲得不是很明白或是有错误,欢迎指正
如您喜欢的话不妨点个赞收藏一下吧
[The 2019 Asia Yinchuan First Round Online Programming] D Take Your Seat的更多相关文章
- The 2019 Asia Yinchuan First Round Online Programming F. Moving On
t题目链接:https://nanti.jisuanke.com/t/41290 思路:题目意思很容易想到floyd,但是由于危险度的限制,我们该怎么跑floyd呢. 一开始理解错题目了,以为u-&g ...
- “2018宁夏邀请赛 ” 兼 “The 2019 Asia Yinchuan First Round Online Programming”
------------7题弟弟,被各位半小时13题的大佬打惨了(滑稽)---------- 签到题就不写了. F :Moving On (1247ms) 题意:给定大小为N的带 ...
- The 2019 Asia Nanchang First Round Online Programming Contest
传送门 A. Enju With math problem 题意: 给出\(a_1,\cdots,a_{100}\),满足\(a_i\leq 1.5*10^8\). 现在问是否存在一个\(pos\), ...
- The 2019 Asia Nanchang First Round Online Programming Contest C(cf原题,线段树维护矩阵)
题:https://nanti.jisuanke.com/t/41350 分析:先将字符串转置过来 状态转移,因为只有5个状态,所以 i 状态到 j 状态的最小代价就枚举[i][k]->[k][ ...
- The 2019 Asia Nanchang First Round Online Programming Contest E. Magic Master
题目链接:https://nanti.jisuanke.com/t/41352 题目意思还是好理解的,看过的人不多,感觉是被通过量吓到了.其实就是个水题,反向模拟就好了, 用队列模拟,反向模拟,它要放 ...
- The 2019 Asia Nanchang First Round Online Programming Contest B. Fire-Fighting Hero
题目链接:https://nanti.jisuanke.com/t/41349 题意:有一个灭火英雄,和一个灭火团队,一个人与一个团队比较. 灭火英雄到其他灭火点的最短路最大值,与一个团队到其他灭火点 ...
- The 2019 Asia Nanchang First Round Online Programming Contest The Nth Item
The Nth Item 思路: 先用特征根法求出通向公式,然后通向公式中出现了\(\sqrt{17}\),这个可以用二次剩余求出来,然后可以O(\(log(n)\))求出. 但是还不够,我们先对\( ...
- H. The Nth Item(The 2019 Asia Nanchang First Round Online Programming Contest)
题意:https://nanti.jisuanke.com/t/41355 给出N1,计算公式:A=F(N)Ni=Ni-1 ^ (A*A),F为类斐波那契需要矩阵快速幂的递推式. 求第k个N. 思路: ...
- E.Magic Master(The 2019 Asia Nanchang First Round Online Programming Contest)
直接模拟orhttps://blog.csdn.net/liufengwei1/article/details/100643831
随机推荐
- itop 环境
iTop,即IT运营门户(IT Operation Portal),是一个开源web应用程序,用于IT环境的日常运营.它基于ITIL最佳实践,而又不拘泥于任何具体流程.它很灵活,可以适应不管是非正 式 ...
- JavaWeb三大组件(Servlet、Filter、Listener)
JavaWeb三大组件指的是:Servlet.Filter.Listener,这三个组件在JavaWeb开发中分别提供不同的功能,然而很多人可能只用过其中一个或者两个(Servlet.Filter,比 ...
- Linux服务器下日志截取
我们经常需要去Linux服务器上查看服务运行日志,但是有时候日志文件很大看起来很不方便,这个时候我们需要对日志进行切割筛选出自己需要的日志,比如查看某段时间内的日志,命令如下: sed -n '/ ...
- GIS地理工具案例教程——批量去除多边形的之间的间隙
GIS地理工具案例教程--批量去除多边形的之间的间隙 商务合作,科技咨询,版权转让:向日葵,135-4855__4328,xiexiaokui#qq.com 问题:几乎所有的手工生产的数据,都存在多边 ...
- iptables规则保存
/etc/init.d/iptables save #查看 vim /etc/sysconfig/iptables #将iptables设置为开机启动 chkconfig iptables on #查 ...
- Vue CLI3和Vue CLI2环境搭建
关于 Vue CLI 旧版本的安装以及创建项目 1.搭建 vue 的开发环境 ,安装 vue 的脚手架工具 官方命令行工具 npm install --global vue-cli / cnpm in ...
- java 数据相除
编程的人都知道,java中的“/”.“%”运算,其中前者为取整,后者取余数.那么有没有快捷的运算方法取正常的运算结果呢? /** * TODO 除法运算,保留小数 * @author 袁忠明 * @d ...
- setInterval调用ajax回调函数不执行的问题
setInterval调用ajax回调函数不执行 1.首先检查你的setInterval()函数写法是否正确 参考写法 // 检查是否支付成功 var isPayRequest=false; var ...
- MongoDB数据表添加字段
db.tshare_a.insert( { "_id" : ObjectId("57172b0f657f8bbb34d70147"), "picUrl ...
- Spring cloud微服务安全实战-3-11API安全机制之登录
流控.认证.审计.授权以上都做了初步的简单的实现. 之前写的代码,base64加密了用户名和密码. 缺点1:每次请求都要带用户名密码 增加了泄露的风险. 每次传上来用户名和密码都要check验证.ch ...