首页 > 其他分享 >#296. 最强大脑 题解

#296. 最强大脑 题解

时间:2023-05-27 19:45:04浏览次数:38  
标签:二分 22 最强 题解 样例 bfs front 296

2021-09-22 22:16:56 星期三

#296. 最强大脑 题解

这是一道非常简单的bfs水题。。。。但是为什么没有人做呢? 难道是因为网上搜不到?

理解题意:

输入为 2n * m 大小矩阵。

第一个矩阵表示每个点的分数值, 第二个矩阵则表示这个点是否是特殊点 (1 & 0)

这里规定了一种移动方式, 你可以上左下右四个方向都走,但是重点是从你原来的点走过来,分数值的差不能大于 d, 求出最小的d使我们可以到达所有特殊点的位置。

分析样例

我们可以借助样例进行分析

3 5 // n, m
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

可以看出, 这个样例的 n = 3, m = 5

特殊点有

\[(1, 1), (1, 5), (3, 5) \]

我们会发现 d 如果小于21, 无论怎么走都是走不完这三个点的。

思考

确定算法

本题的关键是如何找到一个最小的 d ,这个 d 要满足一定条件。

首先这个答案一定是具有单调性的,同时如果 d 的值小于答案就一定无法通过,大于答案就一定可以通过, 简而言之就是局部取舍性。

你想到了什么算法?

对 ! 本题的另一个关键算法 二分答案

如何二分

我们首先要找到二分的几个要素, 首先:

二分什么? - > d

二分区间 [l, r] 是? - > [1, 1000000000] (题目中有所要求,分数值最大为1000000000,且为整数)

二分函数怎么写? - > 通过bfs 确定是否可以到达所有的关键点.

如何写出这个代码

bfs 就是普通的bfs在入队列的时候判断一下是否可走, 在可走的地方做出标记,最后比较标记就可以了。

如果满足条件就往下找,不满足条件就往上找就可以了!

// 如果这么水的题你都 Copy,那你就真的颓废了
queue<node> q;
inline bool C(int X) {
	while(q.size()) q.pop();
	q.push(start);
	memset(vis, 0, sizeof vis);
	memset(vis2, 0, sizeof vis2);
	vis[q.front().x][q.front().y] = 1;
	vis2[q.front().x][q.front().y] = 1;
	while (q.size()) {
		node u = q.front(); q.pop();
		for (int i = 1; i <= 4; i++) {
			int x = dx[i] + u.x, y = dy[i] + u.y;
			if (x >= 1 && x <= n && y >= 1 && y <= m) {
				if (vis[x][y]) continue;
				if (abs(a[u.x][u.y] - a[x][y]) < X) {
					q.push((node){x, y});
					vis[x][y] = 1;
					if (b[x][y] == 1) vis2[x][y] = 1;
				}
			}
		}
	}
	//思考:如何判断?
	return 1;
}

标签:二分,22,最强,题解,样例,bfs,front,296
From: https://www.cnblogs.com/Zheng-XiangYu/p/17437222.html

相关文章

  • #295. 「BJWC2010」矩阵距离 题解 2021-09-23 21:42:32
    #295.「BJWC2010」矩阵距离又是一道需要真正思考了才可以做出来的水题。题目描述给出一个N*M的01矩阵,输出每个0到离这个点最近的1的距离。思考历程暴力由于$N\le10^3$如果在赛场上出现这个题,我们优先考虑暴力。暴力也是很简单,从每个为0的点出发bfs找到与最近的......
  • 第三届里奇杯编程大赛(初赛)题解(正在更新文字解释)
    A.签到签到题,直接输出即可。#include<bits/stdc++.h>usingnamespacestd;intmain(){ cout<<"HelloLiqicontest"; return0;}B.挂科读取到每个人的成绩后,判断符合挂科条件(分数$<p$)就\(res\)增加一位同学。#include<iostream>#include<algorithm>......
  • c++模板的引用类型参数折叠问题解释
    template<typenameT>voidf1(T&);实参可以是左值、const类型的左值,不能是右值。f1(i);  //正确,i是int型,T是intf1(c); //正确,i是constint型,T是constintf1(5); //错误 template<typenameT>voidf1(constT&);实参可以是左值、const类型的左值、......
  • 题解 P5597【【XR-4】复读】
    一道好题!挺对我脑回路的,于是秒掉了,来写个题解。下文称执行一遍指令的过程为一个周期。例如指令是LRU,那么LRULRULRULRU共执行了四个周期。看到平方的数据范围,不难想到枚举第一个周期的终点。作为一台优秀的复读机,我们知道每个周期在树上发生的相对位移是相同的。例如,如下的一......
  • 使用SpringMVC 拦截器导致出现@CrossOrigin失效问题解决办法
    非简单请求会发起一个OPTIONS方法的预检请求,这个请求会被拦截器拦截,但是服务器没有给浏览器返回必要的跨域指示信息(比如:“Access-Control-Allow-Origin”----允许哪些请求访问),浏览器没收到指示信息,就认为服务器不允许跨域请求,就会报错。所以需要在拦截器拦截OPTIONS方法的预......
  • Python_手动下载Chrome驱动找不到对应版本,尝试pip自动下载对应版本的驱动,问题解决
    pipinstallwebdriver-manager 验证是否成功代码如下:fromseleniumimportwebdriverdriver=webdriver.Chrome()url='https://www.csdn.net/'driver.get(url)driver.maximize_window()验证成功......
  • JOISC 2017 题解
    JOISC2017Day1开荒者Cultivation首先进行转化,转化为对于每个点\(x,y\),将其扩成一个左上角为\((x-a,y-c)\)右下角为\((x+b,y+d)\)的矩形后覆盖整个\(R\timesC\)的大举行。首先考虑枚举\(a,b\),那么我们可以得到平面上的几条垂直线段,那么我们可以得到一些关于\(c,d\)......
  • 校门外歪脖树上的鸽子 题解
    题面(图是偷来的)。\(1\len,m\le2*10^5,1\led_i\le10^8\)。样例输入:564536128711512232151253224235样例输出:0539广义二叉树有这样一种普遍的处理方法:定义\(is_a\)表示\(a\)是否是它父亲的左儿子。(根的值为\(-1\))定义\(f......
  • 2023年5月26日 问题解答
    为了解决问题一,我们可以使用调度算法来规划自动导引车的行动,以确保所有待加工任务能够顺利完成。首先,我们需要确定任务的处理顺序。根据表1中给出的加工时间,我们可以按照加工时间从小到大的顺序对任务进行排序。然后,我们可以使用一个列表来表示每台自动导引车的状态。初始时,所有......
  • 河北工业大学 ACM 集训队 2023 年夏季选拔 题解 12/12
    https://ac.nowcoder.com/acm/contest/59007A假设数字n有len位则小len的长度,每个都有九个方案。长度和len一样的,至少有n[0]-1种方案n[0]n[0]n[0]...的这个方案暴力地跑一遍看看是不是小于等于n即可#include<bits/stdc++.h>usingnamespacestd;typedeflonglongll;in......