HDU 6229 Wandering Robots(2017 沈阳区域赛 M题,结论)

题目链接  HDU 6229

题意 在一个$N * N$的格子矩阵里,有一个机器人。

  格子按照行和列标号,左上角的坐标为$(0, 0)$,右下角的坐标为$(N - 1, N - 1)$

  有一个机器人,初始位置为$(0, 0)$。

  现在这个矩阵里面,有一些障碍物,也就是说机器人不能通过这些障碍物。

  若机器人当前位置为$(x, y)$,那么他下一个位置有可能为与当前格子曼哈顿距离为$1$的所有格子的任意1个。

  也有可能停留在原来的位置$(x, y)$

  求经过无限长的时间之后,这个机器人的位置在给定区域的概率。

  结果用分数表示。

  给定区域为$(x, y)$,满足 $x + y ≥ N - 1$

  题目满足无障碍区域是连通的

当时在现场,和Au的差距就是罚时和这道题。

结论其实很简单,但是赛场上因为思维僵化就是想不出来。

首先对于每个点,初始都有一个权值。

角落的权值为$3$,边上但不是角落的权值为$4$,其他点权值为$5$。

我们对每个障碍点进行处理。障碍点的权值直接赋值为$0$,障碍周围的点权值减$1$

由于开不下那么大的二维数组,所以对那些被操作过的点,我们用map记录。

最后把区域内的权值累加,除以整个矩形的权值和即为答案。

#include <bits/stdc++.h>

using namespace std;

#define rep(i, a, b)	for (int i(a); i <= (b); ++i)
#define dec(i, a, b)	for (int i(a); i >= (b); --i)
#define MP		make_pair
#define	fi		first
#define	se		second

typedef long long LL;
typedef pair <int, int> PII;

const int dx[] = {1, 0, -1, 0};
const int dy[] = {0, 1, 0, -1};

int T;
int n, m;

map < pair <int, int>  , LL > mp;
int ca = 0;

inline LL judge(int x, int y){
	if ((x == 0 && y == 0) || (x == 0 && y == n - 1) || (x == n - 1 && y == 0) || (x == n - 1 && y == n - 1)) return 3;
	if (x == 0 || x == n - 1 || y == 0 || y == n - 1) return 4;
	return 5;
}

inline bool check(int x, int y){
	return (x + y) >= (n - 1);
}

inline bool ok(int x, int y){
	return x >= 0 && y >= 0 && x <= n - 1 && y <= n - 1;
}

LL gcd(LL a, LL b){
	return b == 0 ? a : gcd(b, a % b);
}

int main(){

	scanf("%d", &T);
	while (T--){
		scanf("%d%d", &n, &m);
		LL all = 4 * 3 + (n - 2) * 4 * 4 + 5 * (n - 2) * (n - 2);
		LL xx1 = 3, xx2 = 2 * (n - 2);
		LL xx3 = n * (n + 1) / 2 - xx1 - xx2;
		LL sum = xx1 * 3 + xx2 * 4 + xx3 * 5;

		mp.clear();
		while (m--){
			int x, y;
			scanf("%d%d", &x, &y);
			mp[MP(x, y)] = judge(x, y);
			rep(i, 0, 3){
				int nx = x + dx[i], ny = y + dy[i];
				if (ok(nx, ny)){
					++mp[MP(nx, ny)];
					mp[MP(nx, ny)] = min(mp[MP(nx, ny)], judge(nx, ny));
				}
			}

		}

		for (auto cnt : mp){
			int x = cnt.fi.fi, y = cnt.fi.se;
			LL  z = cnt.se;
			if (check(x, y)) sum -= z;
			all -= z;
		}

		LL a1 = sum, a2 = all;
		LL g = gcd(a1, a2);
		a1 /= g, a2 /= g;
		printf("Case #%d: %lld/%lld\n", ++ca, a1, a2);
	}

	return 0;
}

  

原文地址:https://www.cnblogs.com/cxhscst2/p/8215717.html

时间: 2024-11-07 23:10:15

HDU 6229 Wandering Robots(2017 沈阳区域赛 M题,结论)的相关文章

hdu6223 Infinite Fraction Path 2017沈阳区域赛G题 bfs加剪枝(好题)

题目传送门 题目大意:给出n座城市,每个城市都有一个0到9的val,城市的编号是从0到n-1,从i位置出发,只能走到(i*i+1)%n这个位置,从任意起点开始,每走一步都会得到一个数字,走n-1步,会得到一个长度为n的数列,输出能得到的最大的数列(当成数字). 思路: 一个数字肯定是最高位越大,这个数字本身就越大,所以肯定第一位要取最大值,在这一位取最大值的时候后面每一位都要尽量最大,所以想到bfs. 但是bfs肯定要剪枝,怎么剪枝呢? 1.按照思路,我要取每一位尽可能大的值,所以某一个状态的某

HDU 6205 2017沈阳网络赛 思维题

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6205 题意:给你n堆牌,原本每一堆的所有牌(a[i]张)默认向下,每次从第一堆开始,将固定个数的牌(b[i]张)翻上,然后下一堆继续,直到没有足够的牌翻上,然后你可以获得当前已经操作过的堆的所有牌.最初你可以调整堆的顺序,把第一堆放到最后一堆(逆时针旋转),你可以重复这个操作,问你要重复多少次这个操作,才能获得最多的牌. 解法:先把这个序列复制一遍放在原来的序列后面.当i=n的时候结束就可以了,每次

2017年ICPC中国大陆区域赛真题(下)

2017年ICPC中国大陆区域赛真题(下) A - Lovers #include <bits/stdc++.h> using namespace std; const int maxn=2e5+10; int n,k,a[maxn],b[maxn],ans; int main() { int _; scanf("%d", &_); while (_--) { scanf("%d%d", &n, &k); for (int i =

[暑假集训]区域赛套题集

2014-07-03 [浙江第11届省赛]ZOJ 3785 What day is that day?  (打表找循环节) [暑假集训]区域赛套题集

Heshen&#39;s Account Book HihoCoder - 1871 2018北京区域赛B题(字符串处理)

Heshen was an official of the Qing dynasty. He made a fortune which could be comparable to a whole country's wealth by corruption. So he was known as the most corrupt official in Chinese history. But Emperor Qianlong liked, or even loved him so much

沈阳区域赛总结

[印象·沈阳] 是在去南阳的车上接到老师电话,问愿不愿意接着去沈阳,犹豫了一下,决定尝试一下,国赛结束后休整了两天,又启程去沈阳.这次去沈阳参加区域赛刷新了我的个人最北记录,先坐船去大连,再转车沈阳,到大连的时候下着小雨,挺清凉的,给人一种北国的温度.中午到了沈阳,出了火车站就有地铁,转一路地铁就看到了沈阳的真面目.相似的楼房,处处都有一种工业化的气息.宾馆不远,很快就到了.宾馆在东北大学东门外三好街上,是一条电子产业集散地,随处可见的电脑批发零售店,各种电脑城,有种到了北京中关村的感觉.进了东

HDU 4438 Hunters 区域赛水题

本文转载于 http://blog.csdn.net/major_zhang/article/details/52197538 2012天津区域赛最水之题: 题意容易读懂,然后就是分情况求出A得分的数学期望,所谓数学期望就是在该概率下的平均得分. 现在就是两种方案,Alice要根据输入给出的数据情况选出最优方案,也就是先选老虎,还是狼. 1.A先选老虎: a.B也先选老虎,则得分为Q(P*X+P*Y); //打完老虎还要打狼 b.B选狼,则两人可以直接获得猎物,则得分为(1-Q)*X 所以1方案

hdu5080:几何+polya计数(鞍山区域赛K题)

/* 鞍山区域赛的K题..当时比赛都没来得及看(反正看了也不会) 学了polya定理之后就赶紧跑来补这个题.. 由于几何比较烂写了又丑又长的代码,还debug了很久.. 比较感动的是竟然1Y了.. */ 题目大意: 给定一些点,某些点上有边,问用k种颜色染色的等价类有多少种 思路: 由于坐标是整数..只有可能旋转90,180,270才能得到置换 且图形必须为中心对称图形 先用几何方法找出对称中心 然后旋转,找是否出现置换... 由于点数只有50,几何预处理这一部分可以很暴力无脑的写..各种判断相

HDU 6200 2017沈阳网络赛 树上区间更新,求和

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6200 题意:给个图,有2种操作,一种是加一条无向边,二是查询u,v之间必须有的边的条数,所谓必须有的边就是对于u,v必须通过这条边才能到达. 解法:一个很简单的想法,搞出图上的一颗树,然后剩下的边当成询问点队加到更新点集,每加入一个更新点对,直接把u,v区间的值置为0即可,查询就直接区间求和,可以直接树剖来维护,简单暴力,读入挂卡过.还有1个log的做法,可以用LCT维护(这个没写,口胡的) #in