IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> Codeforces Round #763 (Div. 2) D.Robot Cleaner Revisit 期望/思维 -> 正文阅读

[数据结构与算法]Codeforces Round #763 (Div. 2) D.Robot Cleaner Revisit 期望/思维

|——>传送门<——|

题目描述

给定一张 n × m n \times m n×m的网格图,给定机器人起始位置和垃圾位置,每次机器人可以从 ( x , y ) (x ,y) (x,y) ( x + 1 , y + 1 ) (x + 1, y + 1) (x+1,y+1)运动,碰壁后对方向取反。每次可以将移动到的位置所在的横行和竖列清空掉,现在告诉你当机器人与垃圾同行同列时有 p % p\% p%概率清掉垃圾。问清理垃圾所需移动次数的期望。

题解

首先,机器人移动的过程一定存在循环节,也就是说从某点出发一直按照题目规则移动,一定会回到该点(证明略)。那么不妨设每 L L L步一循环,这 L L L步中有 k k k次与垃圾同行同列。

s i s_i si?表示到第 i i i个点所移动的步数,那么可以列出期望的表达式:

E [ i ] = ∑ j = 0 ∞ ( s i + j × L ) × ( 1 ? p ) j × k + i × p E[i] = \sum^{\infty}_{j = 0}(s_i + j \times L) \times (1 - p)^{j \times k+ i} \times p E[i]=j=0?(si?+j×L)×(1?p)j×k+i×p

对上式进行化简:

E [ i ] = ∑ j = 0 ∞ [ ( s i × p ) + ( j × L × p ) ] × ( 1 ? p ) j × k + i E[i] = \sum^{\infty}_{j = 0}[(s_i \times p) + (j \times L \times p) ] \times (1 - p)^{j \times k + i} E[i]=j=0?[(si?×p)+(j×L×p)]×(1?p)j×k+i

= ∑ j = 0 ∞ [ ( s i × p × ( 1 ? p ) i ) + ( j × L × p × ( 1 ? p ) i ) ] × ( 1 ? p ) j × k = \sum^{\infty}_{j = 0}[(s_i \times p \times (1 - p)^i) + (j \times L \times p \times (1 - p)^i) ] \times (1 - p)^{j \times k} =j=0?[(si?×p×(1?p)i)+(j×L×p×(1?p)i)]×(1?p)j×k

= ∑ j = 0 ∞ [ s i × p × ( 1 ? p ) i ] × ( 1 ? p ) j × k + [ j × L × p × ( 1 ? p ) i ] × ( 1 ? p ) j × k = \sum^{\infty}_{j = 0}[s_i \times p \times (1 - p)^i] \times (1 - p)^{j \times k} + [j \times L \times p \times (1 - p)^i] \times (1 - p)^{j \times k} =j=0?[si?×p×(1?p)i]×(1?p)j×k+[j×L×p×(1?p)i]×(1?p)j×k

= [ s i × p × ( 1 ? p ) i ] × ∑ j = 0 ∞ ( 1 ? p ) j × k + [ L × p × ( 1 ? p ) i ] × ∑ j = 0 ∞ j × ( 1 ? p ) j × k = [s_i \times p \times (1 - p)^i] \times \sum^{\infty}_{j = 0} (1 - p)^{j \times k} + [L \times p \times (1 - p)^i] \times \sum^{\infty}_{j = 0}j \times (1 - p)^{j \times k} =[si?×p×(1?p)i]×j=0?(1?p)j×k+[L×p×(1?p)i]×j=0?j×(1?p)j×k

∑ j = 0 ∞ ( 1 ? p ) j × k \sum^{\infty}_{j = 0} (1 - p)^{j \times k} j=0?(1?p)j×k,设 q = ( 1 ? p ) k q = (1 - p)^k q=(1?p)k,等比数列求和后,由于 ( 1 ? p ) ≤ 1 (1 - p) \leq 1 (1?p)1,故数列收敛,取极限得 1 1 ? q = 1 1 ? ( 1 ? p ) k \frac{1}{1 - q} = \frac{1}{1 - (1 - p)^k} 1?q1?=1?(1?p)k1?

∑ j = 0 ∞ j × ( 1 ? p ) j × k \sum^{\infty}_{j = 0}j \times (1 - p)^{j \times k} j=0?j×(1?p)j×k,发现为一等差数列项 × \times ×等比数列项的形式,运用错位相减法求和后同样取极限得 ( 1 ? p ) k [ 1 ? ( 1 ? p ) k ] 2 \frac{(1 - p)^k}{[1 - (1 - p)^k]^2} [1?(1?p)k]2(1?p)k?

于是可得:
E [ i ] = s i × p × ( 1 ? p ) i 1 ? ( 1 ? p ) k + L × p × ( 1 ? p ) i + k [ 1 ? ( 1 ? p ) k ] 2 E[i] = \frac{s_i \times p \times (1 - p)^i}{1 - (1 - p)^k} + \frac{L \times p \times (1 - p)^{i + k}}{[1 - (1 - p)^k]^2} E[i]=1?(1?p)ksi?×p×(1?p)i?+[1?(1?p)k]2L×p×(1?p)i+k?
求和得:
∑ i = 0 k ? 1 E [ i ] = ∑ i = 0 k ? 1 s i × p × ( 1 ? p ) i 1 ? ( 1 ? p ) k + L × ( 1 ? p ) k 1 ? ( 1 ? p ) k \sum_{i = 0}^{k - 1}E[i] = \frac{\sum_{i = 0}^{k - 1}s_i \times p \times(1- p)^i}{1 - (1 - p)^k} + \frac{L \times (1 - p)^k}{1 - (1 - p)^k} i=0k?1?E[i]=1?(1?p)ki=0k?1?si?×p×(1?p)i?+1?(1?p)kL×(1?p)k?
那么直接模拟走的轮数求和即可。

#include <bits/stdc++.h>
#define int long long
#define endl '\n'
using namespace std;

const int N = 2e5 + 10, MOD = 1e9 + 7;
int a[N], b[N];

inline int binpow(int x, int y, int mod, int res = 1){
    for (; y; y >>= 1, (x *= x) %= mod) if (y & 1) (res *= x) %= mod;
    return res;
}

inline int inv(int x){ return binpow(x, MOD - 2, MOD); }

inline void solve(){
    int n, m, rb, cb, rd, cd, p; cin >> n >> m >> rb >> cb >> rd >> cd >> p;
    p = p * inv(100) % MOD;
    int pre = 1, idx = 0, ans = 0, dr = 1, dc = 1;
    map<tuple<int, int, int, int>, bool> mp;
    while(true){
        if (rb + dr < 1 || rb + dr > n) dr *= -1;
		if (cb + dc < 1 || cb + dc > m) dc *= -1;

		if (mp[{rb, cb, dr, dc}]) break;
		else mp[{rb, cb, dr, dc}] = true;
		if (rb == rd || cb == cd) {
			ans = (ans + idx * pre % MOD * p % MOD) % MOD;
			pre = pre * (1 - p + MOD) % MOD;
		}
		rb += dr, cb += dc, idx++;
    }
    ans = ((ans + idx * pre % MOD) % MOD) * inv((1 - pre + MOD) % MOD) % MOD;
	cout << ans << endl;
}

signed main(){
    ios_base::sync_with_stdio(false), cin.tie(0);
    int t = 0; cin >> t;
    while(t--) solve();
    return 0;
}
  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-05-01 15:57:51  更:2022-05-01 15:59:33 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 6:02:03-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码