周总结2022.1.1-2022.1.2

这篇博客详细解析了两道编程竞赛题目,涉及区间处理和期望时间计算。第一题是关于机器人的清洁路径,通过区间长度排序和计数解决;第二题则需要计算在特定条件下,机器人清理区域的期望时间,通过二分查找和动态规划方法解决。文章深入浅出地介绍了问题的解题思路和算法实现,适合编程竞赛爱好者和算法学习者阅读。
摘要由CSDN通过智能技术生成

周一到周四:考试

周五:放假回家,摸鱼

1.1

Codeforces Round #763 (Div. 2)

A - Robot Cleaner

简单计数题。

B - Game on Ranges

将区间按照长度从大到小排序,并记录每一个数字出现的次数。从大到小遍历这个区间(保证是按照偏序排序的),遍历区间内包含的所有数字,对于这个区间,出现次数最小的数字就是这个区间的答案。

C - Balanced Stone Heaps

求最小值最大,显然用二分答案。对于这道题目,二分最小值,然后判断每次的最小值是否可行。判断的方法是:从第n个到第3个元素操作,执行的操作是题目中的反向操作,从这一堆里尽可能多地拿出3的倍数的数值,然后按2:1分给前两堆。尽可能多要保证,拿出之后要比x大,同时不能拿出多于原有数值的量。这样选不会产生后效,因为这一堆取完之后就不会再访问了。

1.2

Codeforces Round #763 (Div. 2)

D - Robot Cleaner Revisit

考虑2\times 2的矩阵,待清理的位置在(1,2)。假设我们起始点定在(1,1)的位置,那么机器人只会走(1,1)(2,2)的位置,并循环往复。不难看出,机器人只有两个状态,而这两种状态之间又可以通过概率来建立关系。设x是起始在(1,1)处时的答案,y是起始在(2,2)处时的答案。

如果我们在(1,1)处没有正常工作(发生的概率为\bar{p}=1-p),那么机器人会走到下一个状态(2,2)。而当(2,2)起始时期望时间时y,那么在(1,1)失败之后再走到(2,2)的期望时间就会是y+1

如果我们在(1,1)处正常工作了(发生的概率为p),那么机器人清理到的时间是0,因为不需要移动就可以达成目标。

综上所述,在起始点为(1,1)时的期望时间xy的关系是:

x=p\times 0+\bar{p}\times (y+1)=\bar{p}\times(y+1)

同理,当起始点为(2,2)时的期望时间yx的关系也可以用同样的方法得到:

y=p\times 0+\bar{p}\times (x+1)=\bar{p}\times (x+1)

将两等式联立,我们可以得到:

x=\bar{p}\times (\bar{p}\times (x+1)+1)

已知概率p,即可求解出期望时间x

考虑一个更复杂的情况。我们发现,机器人的运动轨迹可以看作是周期性的运动,即一定会有一个时刻,机器人的状态在位置上和运动方向上都与初始状态相同。所以,我们只需要在乎在这个周期性的运动中,每一次的移动,机器人的位置信息、运动方向信息和当前是否有机会清理到待清理物(即与待清理物同行或同列)。

我们考虑两种情形,设某一次移动中,起点处作为起始点的期望时间是x_1,终点处作为起始点的期望时间是x_2

  1. 若当前移动的终点可以清理到待清理物,则有x_1=\bar{p}\times (1+x_2);
  2. 若当前移动的终点不能清理到待清理物,则有x_1=1+x_2

注意到,(1+x_2)前面的系数只可能有两种,要么是\bar{p},要么是1

所以更一般地,我们将式子变为:x_i=a_i\times (1+x_{i+1})(a_i=1,\bar{p})

我们对于每一次移动,都可以列出类似这样的式子,假设我们有n次移动作为一次周期性运动,那么我们可有列出:

x_1=a_1\times (1+x_2)
x_1=a_2\times (1+x_3)
x_1=a_3\times (1+x_4)
\cdots
x_1=a_n\times (1+x_1)

将这些等式联立可得:

x_1=a_1\times (1+a_2\times (1+a_3\times (1+a_4\times (\cdots+a_n\times (1+x_1)\cdots))))

整理得:

(1-a_{1} a_{2} a_{3}\cdots a_n)\times x_1=a_1+a_1a_2+a_1a_2a_3+\cdots+a_1a_2\cdots a_n

x_1=\frac{a_1+a_1a_2+a_1a_2a_3+\cdots+a_1a_2\cdots a_n}{1-a_{1} a_{2} a_{3}\cdots a_n}

对于所有的除法,我们都用逆元处理即可。

AC代码:

#include<bits/stdc++.h>

using namespace std;

typedef long long LL;
const LL p = 1e9 + 7;

template <class T> void exgcd(T E_A, T E_B, T &E_X, T &E_Y) {
	if (!E_B) E_X = 1, E_Y = 0;
	else exgcd(E_B, E_A % E_B, E_Y, E_X), E_Y -= E_A / E_B * E_X;
}

template <class T> T niyuan(T NY_a, T NY_p) {
	LL NY_x, NY_y; exgcd(NY_a, NY_p, NY_x, NY_y); 
	return (NY_x % NY_p + NY_p) % NY_p; 
}

inline LL read() {
	LL x = 0, y = 1; char c = getchar(); 
	while (c > '9' || c < '0') { if (c == '-') y = -1; c = getchar(); }
	while (c>='0'&&c<='9') { x=x*10+c-'0';c=getchar(); } return x*y;
}

LL n, m, rb, cb, rd, cd, pa, pb; 
LL et, ai;
vector<LL> a;
LL mul = 1, sum, ans;
LL od, oc;

void main2()
{
	a.clear();
	n = read(); m = read(); rb = read(); cb = read(); rd = read(), cd = read();
	pa = read();
	pb = ((1 - (pa * niyuan(100ll, p))) % p + p) % p;
	LL rx = rb, cx = cb, dr = 1, dc = 1;
	if (rx == rd || cx == cd) a.push_back(pb);
	else a.push_back(1);
	od = oc = 1;
	if (cx == 1) dc = oc = 1;
	else if (cx == m) dc = oc = -1;
	if (rx == 1) dr = od = 1;
	else if (rx == n) dr = od = -1;
	rx += dr; cx += dc;
	if (cx == 1 and dc == -1) dc = 1;
	if (cx == m and dc == 1) dc = -1;
	if (rx == 1 and dr == -1) dr = 1;
	if (rx == n and dr == 1) dr = -1;
	while (!(cx == cb && rx == rb && dr == od && dc == oc)) 
	{
		if (rx == rd or cx == cd) a.push_back(pb);
		else a.push_back(1); 
		rx += dr; cx += dc;
		if (cx == 1 and dc == -1) dc = 1;
		if (cx == m and dc == 1) dc = -1;
		if (rx == 1 and dr == -1) dr = 1;
		if (rx == n and dr == 1) dr = -1;
	}
	ai = a.size();
	mul = 1; sum = 0;
	for (LL i = 0; i < ai; ++i)
	{
		mul = (mul * a[i]) % p;
		sum = (sum + mul) % p; 
	}
	ans = ((sum * niyuan(((1 - mul) % p + p) % p, p)) % p + p) % p;
	cout << ans << endl; 
}
LL T = 1;
int main()
{
	T = read();
	for (LL t = 1; t <= T; ++t)
	{
		main2();
	}
	return 0;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值