P2658 汽车拉力比赛

前言

今天zty带来的是P2658 汽车拉力比赛,大家给个赞呗, zty开学了,更新是会变少的,这个学期是zty的毕业学期了,过完这学期zty就毕业了

先 赞 后 看 养 成 习 惯
在这里插入图片描述


先 赞 后 看 养 成 习 惯
演示用编译器及其标准
Dev C++ 6.7.5 Red panda C++14

正文

P2658 汽车拉力比赛

题目描述

博艾市将要举行一场汽车拉力比赛。

赛场凹凸不平,所以被描述为 N∗MN*MNM 的网格来表示海拔高度 (1≤M,N≤500)(1 \leq M,N \leq 500)(1M,N500),每个单元格的海拔范围在 00010910^9109 之间。

其中一些单元格被定义为路标。组织者希望给整个路线指定一个难度系数 DDD,这样参赛选手从任一路标到达别的路标所经过的路径上相邻单元格的海拔高度差不会大于 DDD 。也就是说这个难度系数 DDD 指的是保证所有路标相互可达的最小值。任一单元格和其东西南北四个方向上的单元格都是相邻的。

输入格式

111 行两个整数 MMMNNN。第 222 行到第 M+1M+1M+1 行,每行 NNN 个整数描述海拔高度。第 2+M2+M2+M 行到第 1+2M1+2M1+2M

行,每行 NNN 个整数,每个数非 000111111 表示该单元格是一个路标。

输出格式

一个整数,即赛道的难度系数 DDD

输入输出样例 #1

输入 #1

3 5 
20 21 18 99 5  
19 22 20 16 26
18 17 40 60 80
1 0 0 0 1
0 0 0 0 0
0 0 0 0 1

输出 #1

21
#include<iostream>
#include<algorithm>
#include<cstring>
#include<queue>
#define x first
#define y second
using namespace std;

typedef pair<int, int> PII;
const int N = 510, M = 510;
int high[N][M];    //º£°Î
int flag[N][M];    //᱐
int n, m;
queue <PII> q;
PII p[N * M];
int pnum;      //·±ê×ÜÊý
int dx[] = { -1, 0, 1, 0 };
int dy[] = { 0, 1, 0, -1 };
int height;
bool st[N][M];

bool check(int x) {
	q.push({p[0].x, p[0].y});
	int cnt = 1;
	st[p[0].x][p[0].y] = true;
	while (q.size()) {
		auto t = q.front();
		q.pop();

		for (int i = 0; i < 4; i++) {
			int a = t.x + dx[i], b = t.y + dy[i];
			if (a < 1 || a > n || b < 1 || b > m) continue;
			if (st[a][b]) continue;
			if (abs(high[a][b] - high[t.x][t.y]) > x) continue;

			q.push({ a, b });
			st[a][b] = true;

			if (flag[a][b] == 1) {
				cnt++;
				if (cnt == pnum)
					return true;
			}
		}
	}
	return false;
}
int main() {

	scanf("%d%d", &n, &m);

	for (int i = 1; i <= n; i++) {
		for (int j = 1; j <= m; j++) {
			scanf("%d", &high[i][j]);
			height = max(height, high[i][j]);
		}
	}
	for (int i = 1; i <= n; i++) {
		for (int j = 1; j <= m; j++) {
			scanf("%d", &flag[i][j]);
			if (flag[i][j] == 1) p[pnum++] = { i, j };
		}
	}
	//¶þ·Ö´ð°¸
	int l = -1, r = height + 1;
	while (l + 1 < r) {
		while (q.size()) q.pop();
		memset(st, false, sizeof(st));
		int mid = (l + r) / 2;
		if (check(mid)) r = mid;
		else l = mid;

	}
	cout << r;
	return 0;
}

后记

作者:zty郑桐羽呀
联系方式:(企鹅 3782663736)
兄弟们给个赞呗
先 赞 后 看 养 成 习 惯

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zty郑桐羽呀 『ZTY』主团团长

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值