题意

一个\(n \times m\)的矩形空间,起点是\((1,1)\),终点是\((n,m)\)。

假设当前位于\((x,y)\):

  • 如果当前位于最后一行,那么下一步只能走向\((x,y+1)\)
  • 如果当前位于最后一列,那么下一步只能走向\((x+1,y)\)
  • 否则,以相等的概率走向\((x,y+1)\)和\((x+1,y)\)中的一个。

矩形空间中有一个小的矩形黑洞,用左上角和右下角的坐标表示,走进黑洞视为游戏失败,走到\((n,m)\)视为游戏成功,问游戏成功的概率。

解题思路

先不考虑黑洞。

对于\(1 \leq x < n, 1 \leq y < m\),走到\((x,y)\)一共有\(C_{x+y-2}^{x-1}\)种可能的路径,然后走每一条可能的路径的概率为\(\frac{1}{2^{x+y-2}}\),所以走到\((x,y)\)的概率是\(\frac{C_{x+y-2}^{x-1}}{2^{x+y-2}}\)。

但是\(n,m\)的取值最高可以到\(1e5\),如果不加处理会炸精度,如果使用\(\log\)处理就可以把数值压在能接受的范围内。再加上

\[2^{\log(\frac{C_{x+y-2}^{x-1}}{2^{x+y-2}})} = 2 ^ {\log((x + y - 2)!)-\log((y-1)!) - -\log((x-1)!) - x -y +2}
\]

\(O(n)\)预处理出\(\log(i!)\)后就可以方便的计算\(P(x,y)\)了。

然后根据规则,最后一行和最后一列的概率要另外算。这里仅以最后一行为例,最后一列也是用同样的方法。

记走到\((x,y)\)的概率为\(P(x,y)\),那么如果\((x,y)\)位于最后一行,则\(P(x,y)=P(x,y-1)+\frac{1}{2}P(x-1,y)\)。然后\(P(1,n)\)很容易推出等于\(\frac{1}{2^{n-1}}\),所以这一行的概率就可以\(O(n)\)的递推出来。

假设上图中,黑色部分为黑洞,\((1,1)\)位于坐上角,那么很容易就可以得出游戏成功的概率为走到灰色格子的概率之和。将之前推导出的公式代入即可。

总结

早上七点的比赛差点错过了。前三题几乎都是直接秒,但是卡在了第四题。公式都推对了,但是没有想到炸精度怎么处理。脑海中出现了之前llg想在学校月赛搞用log处理大数的出题思路,但是看精度一直觉得不太行,然后就下班了,哪想到这就是正解。果然有时候就应该xjbg。

然后补题的时候又是因为担心精度问题用了long double,然后各种TLE,换成double就过了。

AC代码

#include<bits/stdc++.h>
using namespace std;
const int N = 2e5 + 5; double lg[N], lstr[N], lstc[N];
int main()
{
#ifdef BACKLIGHT
freopen("in.txt", "r", stdin);
#endif lg[0] = 0;
for (int i =1; i <= 2e5; ++i) lg[i] = lg[i-1] + log2(i); int T;
scanf("%d", &T);
for (int Case = 1; Case <= T; Case ++) {
int n, m, l, r, u, d;
scanf("%d %d %d %d %d %d", &n, &m, &l, &u, &r, &d); lstr[1] = pow(2, lg[1 + n - 2] - lg[1 - 1] - lg[n - 1] - 1 - n + 2);
for (int i = 2; i <= m; i++) {
lstr[i] = lstr[i-1] + 0.5 * pow(2, lg[i + (n-1)- 2] - lg[i - 1] - lg[(n-1) - 1] - i - (n-1) + 2);
} lstc[1] = pow(2, lg[1 + m - 2] - lg[1 - 1] - lg[m - 1] - 1 - m + 2);
for (int i = 2; i <= n; i++) {
lstc[i] = lstc[i-1] + 0.5 * pow(2, lg[i + (m-1)- 2] - lg[i - 1] - lg[(m-1) - 1] - i - (m-1) + 2);
} double ans = 0, tmp;
for (int i = 1; i <= l - 1; ++i) {
int D = l + d - i;
if(D > m) continue;
else if(D == m) {
ans += lstc[i];
}
else {
tmp = lg[i + D - 2] - lg[i - 1] - lg[D - 1] - i - D + 2;
ans += pow(2, tmp);
}
} for (int i = 1; i <= u - 1; ++i) {
int R = r + u - i;
if(R > n) continue;
else if(R == n) {
ans += lstr[i];
}
else {
tmp = lg[i + R - 2] - lg[i - 1] - lg[R - 1] - i - R + 2;
ans += pow(2, tmp);
}
} printf("Case #%d: %.12lf\n", Case, ans);
}
return 0;
}

Google Kick Start 2020 Round B T4 Wandering Robot的更多相关文章

  1. Google Kick Start 2020 Round B T1-3

    这场题目除了最后一题稍微难了点,其他都是1眼题. T1 Bike Tour 没啥好说的,一个循环解决. T2 Bus Routes 没啥好说的,从第\(n\)的车站开始贪心取最晚的. T3 Robot ...

  2. Google Kick Start 2020 Round C

    ac代码 A. Countdown for循环跑一跑,没啥好说的. B. Stable Wall 如果\(s_{i,j} \ne s_{i+1,j}\),那么说明\(s_{i+1,j}\)必须在\(s ...

  3. Google Kick Start Round G 2019

    Google Kick Start Round G 2019 Book Reading 暴力,没啥好说的 #include<bits/stdc++.h> using namespace s ...

  4. Google Kick Start 2019 C轮 第一题 Wiggle Walk 题解

    Google Kick Start 2019 C轮 第一题 Wiggle Walk 题解 题目地址:https://codingcompetitions.withgoogle.com/kickstar ...

  5. [C++]Store Credit——Google Code Jam Qualification Round Africa 2010

    Google Code Jam Qualification Round Africa 2010 的第一题,很简单. Problem You receive a credit C at a local ...

  6. Google Code Jam 2010 Round 1C Problem A. Rope Intranet

    Google Code Jam 2010 Round 1C Problem A. Rope Intranet https://code.google.com/codejam/contest/61910 ...

  7. kick start 2019 round D T3题解

    ---恢复内容开始--- 题目大意:共有N个房子,每个房子都有各自的坐标X[i],占据每个房子需要一定花费C[i].现在需要选择K个房子作为仓库,1个房子作为商店(与题目不同,概念一样),由于仓库到房 ...

  8. dp - Google Code jam Qualification Round 2015 --- Problem B. Infinite House of Pancakes

    Problem B. Infinite House of Pancakes Problem's Link:   https://code.google.com/codejam/contest/6224 ...

  9. Google Code jam Qualification Round 2015 --- Problem A. Standing Ovation

    Problem A. Standing Ovation Problem's Link:   https://code.google.com/codejam/contest/6224486/dashbo ...

随机推荐

  1. MySQL面试题!新鲜出炉~

    01.Mysql 的存储引擎,myisam和innodb的区别? 答:1.MyISAM 是非事务的存储引擎,适合用于频繁查询的应用.表锁,不会出现死锁,适合小数据,小并发. 2.innodb是支持事务 ...

  2. 自定制格式化方式format

    自定制格式化方式format # x='{0}{0}{0}'.format('dog') # # print(x) # class Date: # def __init__(self,year,mon ...

  3. 文章要保存为TXT文件,其中的图片要怎么办?Python帮你解决

    前言 用 python 爬取你喜欢的 CSDN 的原创文章,保存为TXT文件,不仅查看不方便,而且还无法保存文章中的代码和图片. 今天教你制作成 PDF 慢慢看.万一作者的突然把号给删了,也会保存备份 ...

  4. Python中对象实例的__dict__属性

    实例的__dict__并不是一个方法,而是存储与该实例相关的实例属性的字典,对类中定义的方法(函数),方法名也是属性变量,类的__dict__存储所有实例共享的变量和函数(类属性,方法等),类的__d ...

  5. MongoDB学习4:MongoDB复制集机制和原理,搭建复制集

    1.复制集的作用   1.1 MongoDB复制集的主要意义在于实现服务高可用   1.2 它的实现依赖于两个方面的功能:    · 数据写入时将数据迅速复制到另一个独立节点上    · 在接收写入的 ...

  6. Android 开发学习进程0.15 adb cardview framelayout 控件设置状态获取焦点

    Android设备调试桥 即adb 使用adb进行无线调试的一些常用命令 adb tcpip 5555 设置调试端口为5555 防止冲突 adb shell ifconfig wlan0 查询局域网中 ...

  7. CSS动画基础知识

    CSS动画就是通过CSS (Cascading Style Sheet,层叠样式表)代码搭建的网页动画.它允许设计师和开发人员通过编辑网站的CSS代码来添加页面动画,从而轻松取代传统动画图片或flas ...

  8. 数据源管理 | 分布式NoSQL系统,Cassandra集群管理

    本文源码:GitHub·点这里 || GitEE·点这里 一.Cassandra简介 1.基础描述 Cassandra是一套开源分布式NoSQL数据库系统.它最初由Facebook开发,用于储存收件箱 ...

  9. 钉钉H5微应用

    公司新项目要用到Vue+钉钉H5,在此记录一下免密登录: 引入插件: import * as dd from 'dingtalk-jsapi' import { login as loginUrl } ...

  10. My_Tomcat_Host 靶机

    1:扫描网段: 发现主机IP为192.168.1.203 2:nmap 扫描端口信息 发现8080端口开启了http服务  22ssh服务 3:尝试ssh连接是需要密码的,然后访问8080端口 4:发 ...