二分+BFS——刺杀大使(洛谷 P1902)
题目选自洛谷P1902
我们在题面中看到了最大值最小 这五个字。
很容易就想到了二分答案。
同时题目涉及图,以及只能从四个方向,所以想到了BFS的解法
将这两种方法一起使用,就得到了答案!
题目描述
某组织正在策划一起对某大使的刺杀行动。他们来到了使馆,准备完成此次刺杀,要进入使馆首先必须通过使馆前的防御迷阵。
迷阵由 n×m 个相同的小房间组成,每个房间与相邻四个房间之间有门可通行。在第 n 行的 m 个房间里有 m 个机关,这些机关必须全部打开才可以进入大使馆。而第 1 行的 m 个房间有 m 扇向外打开的门,是迷阵的入口。除了第 1 行和第 n 行的房间外,每个房间都被使馆的安保人员安装了激光杀伤装置,将会对进入房间的人造成一定的伤害。第 i 行第 j 列 造成的伤害值为 pi,j(第 1 行和第 n 行的 p 值全部为 0)。
现在某组织打算以最小伤害代价进入迷阵,打开全部机关,显然,他们可以选 择任意多的人从任意的门进入,但必须到达第 n 行的每个房间。一个士兵受到的伤害值为他到达某个机关的路径上所有房间的伤害值中的最大值,整个部队受到的伤害值为所有士兵的伤害值中的最大值。现在,这个恐怖组织掌握了迷阵的情况,他们需要提前知道怎么安排士兵的行进路线可以使得整个部队的伤害值最小。
输入格式
第一行有两个整数 n,m,表示迷阵的大小。
接下来 n 行,每行 m 个数,第 i 行第 j 列的数表示 pi,j。
输出格式
输出一个数,表示最小伤害代价。
输入输出样例
输入 1
4 2 0 0 3 5 2 4 0 0
输出 1
3
说明/提示
- 50% 的数据,n,m≤100;
- 100% 的数据,n,m≤1000,pi,j≤1000。
解题详解:
因为我们只需要判断一下能不能走到,如果走到了且没有超过设定的最大值,则这样行得通,继续二分查找
那么如何判断这个二分的mid满足解吗?
很简单,由于我们只考虑一条路上的值,是否超过了我们mid的值,
而不去考虑一条路上的最大值,因为没有关系啊,我们只需要判断这个答案是否可行,
而不是刚好可行,所以只要它不超过我们的答案就可以了~
如果超过了,那么我们在BFS中不走这一个点,
最后看是否能走到第n行即可!
还有一个小技巧,在使用bfs的时候 我们没有额外去建立一个结构体,
而是使用了C++ STL里的pair方法!!很方便~~
解题代码:
#include<stdio.h>
#include<iostream>
#include<stdlib.h>
#include<math.h>
#include<string.h>
#include<algorithm>
#include<queue>
#include<vector>
#include<stack>
#include<list>
#include<map>
#include<set>
using namespace std;
const int dx[5] = {0, 1, 0, -1, 0};
const int dy[5] = {0, 0, 1, 0, -1};
int n,m,p[1001][1001],vis[1001][1001],ans;
bool bfs(int x,int y,int maxn){queue<pair<int,int> >q;q.push(make_pair(x,y));vis[x][y] = 1; //初始化操作while(!q.empty()){int xx = q.front().first;int yy = q.front().second;for(int i=1;i<=4;i++){int nx = xx + dx[i];int ny = yy + dy[i];if(nx <1 || nx > n || yy < 1 || yy > m || vis[nx][ny] || p[nx][ny] > maxn)continue; //这样走不通vis[nx][ny] = 1;if(nx == n) return 1;else q.push(make_pair(nx,ny));}q.pop();}return 0;
}
int main(){int l = 0x3f3f3f3f,r = -0x3f3f3f3f; //先初始化为最值cin>>n>>m;for(int i=1;i<=n;i++)for(int j=1;j<=m;j++){cin>>p[i][j];r = max(r, p[i][j]); //更新一下取值的范围l = min(l, p[i][j]);}while(l <= r){memset(vis,0,sizeof(vis));int mid = (l + r) >> 1;if(bfs(1,1,mid)){ans = mid; r = mid - 1;} //可以 还能更小吗?else l = mid + 1; //不可以 只能更大了}printf("%d",ans);return 0;
}
二分+BFS——刺杀大使(洛谷 P1902)相关推荐
- 洛谷P1902 刺杀大使
链接刺杀大使 - 洛谷 大概题意:给你一个n*m的矩阵,第1行和第n行全为0,要你从第1行走迷宫走到第n行去,然后mi'j有对应的伤害,你只会受到路径上的最大伤害,问你能从第1行到第n行受到的最小伤害 ...
- 二分答案——小车问题(洛谷 P1258)
题目选自洛谷P1258 主要是为了练习二分的基本思想, 具体思路如下 当然,还有更直接的方法,因为这道题就像小学解方程一样! 首先车带一个人行驶x段距离 然后丢下 折回找另外一个人 半路碰上 带回终点 ...
- 二分答案——跳石头(洛谷 P2678)
题目选自洛谷P2678 这道题题目并不复杂,思考一下也能知道用二分的方法来做. 难点在于如何判断是否满足条件,以及二分的边界问题. 下面给出详细解题思路: //tot表示需要搬走的石块数量,i表示找的 ...
- 二分答案——进击的奶牛(洛谷 P1824)
题目选自洛谷P1824 很容易看出答案随着区间的增加是单调的,因此采用二分的方式求解, 稍微改动的就是判断函数,这里得到一个距离,依次放入牛,判断能否放入下一头牛,当所有隔间都被遍历完后,如果成功放入 ...
- 二分答案——砍树(洛谷 P1873)
题目选自洛谷P1873 分析:如果句子非常低,可以收集到的木材会更多,以至于超过需要的数量.随着砍树高度逐渐增大,获得的木材会逐渐减少.砍树高度增加到一定程度时,收集到的木材就会开始不够用.因此需要找 ...
- 算法设计 - 二分法和三分法,洛谷P3382
二分法 二分查找:找目标值位置 二分法是一种适用于特殊场景下的分治算法. 这里的特殊场景指的是,二分法需要作用在一个具有单调性的区间内. 比如,我们熟知的二分查找,就是一种二分法的具体实现,二分查找必 ...
- 二分答案——路标设置(洛谷 P3853)
题目选自洛谷P3853 这题不算很难,类似于跳石子,典型的二分答案: 先简单说一下思路: 我们把公路上相邻路标的最大距离定义为该公路的"空旷指数" 求增设路标后能达到的最小&quo ...
- 洛谷P1902 刺杀大使(二分答案+bfs验证)
题目描述 伊朗伊斯兰革命卫队(某恐怖组织)正在策划一起刺杀行动,他们的目标是沙特驻美大 使朱拜尔.他们来到了沙特驻美使馆,准备完成此次刺杀,要进入使馆首先必须通过使馆前 的防御迷阵. 迷阵由 n*m ...
- 洛谷P1902刺杀大使(二分+深搜
某组织正在策划一起对某大使的刺杀行动.他们来到了使馆,准备完成此次刺杀,要进入使馆首先必须通过使馆前的防御迷阵. 迷阵由 n\times mn×m 个相同的小房间组成,每个房间与相邻四个房间之间有门可 ...
最新文章
- ycsb两个阶段说明
- 微信小程序云开发不完全指北
- 深入理解InnoDB(2)—页的存储结构
- 称新手机是“二手货” 消费者起诉要求三倍赔偿
- mysql分组查询统计求和
- Windows Phone 7 button控件
- SpringCloud集成Seata精简入门教程
- 1025. 除数博弈
- 苹果4s怎么越狱_苹果4S怎么下载东西
- 三菱PLC 计数器C
- 成长就是不断升级自己的认知
- java 设置图片大小_java 用这个方法如何设置图片大小
- Vue学习(一)从 mvx模式 到 mvvm模式
- MATLAB---制作动画并演示
- 怎么查看linux自动校验时间,linux校验时间
- 诸葛亮写给后代的一封信,只有86个字
- turn over/turn around/turn up等动词词组
- 特征函数和概率密度函数的关系
- HTTPS与自制SSL证书
- Java实现二分法排序