洛谷p1902刺杀大使题解
方法:二分答案+dfs
二分一个mid,此次刺杀的最大伤害,作为判断条件来dfs,二分,更新。
我们二分一个答案mid来表示一个界限,如果当前这个格子的伤害代价比mid小则可以走否则就不走,每次check函数只需判断能否从第一行走到最后一行即可,因为每一行的每个门都是相连的,所以只要有一个能到,那么我们再派m-1个人顺着这条路过去再沿着横向的门过去就好啦,因为第一行和最后一行的伤害值为零,所以这么做莫得问题。
问:
为什么dfs时只要判断是否能到达即可,我们不是要找他的最大值来表示这一次的伤害值嘛?
答:
因为我们二分的这个值,最后二分出来的一定是某个点产生的伤害值,也就是我们最后的答案(是最大值嘛,判断此点是否可行就是判断他是否是比mid小,所以mid就是此次的最大值就是答案)这也解释了为什么我们二分的是伤害值最后却可以输出二分的边界的问题。
//每次check一个值dfs
//只要map[i][j]的值比mid小就能走
//否则就不能走//二分答案
//每次check的时候记录一个flag
//flag每次清零
//如果在当前的check下能够到达最后一行
//即令flag表示为真
//如果flag为真说明可以到达
//继续二分答案
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
const int N = ;
int n, m, map[N][N], l, r, mid, x, y;
int dx[] = {-, , , }, dy[] = {, , -, };
bool flag = , vis[N][N];
int read() {
int s = , w = ;
char ch = getchar();
while(!isdigit(ch)) {if(ch == '-') w = -;ch = getchar();}
while(isdigit(ch)) {s = s * + ch - '';ch = getchar();}
return s * w;
}
void dfs(int xx, int yy) {
if(xx == n) {flag = ;return;}
for(int i = ; i < ; i++) {
x = xx + dx[i], y = yy + dy[i];
if(x >= && x <= n && y >= && y <= m && map[x][y] <= mid && !vis[x][y]) {
vis[x][y] = ;
dfs(x, y);
vis[x][y] = ;
if(flag) break;
}
}
}
bool check(int x) {
flag = ;
memset(vis, , sizeof(vis));
dfs(, );
if(flag) return ;
return ;
}
int main() {
n = read(), m = read();
for(int i = ; i <= n; i++)
for(int j = ; j <= m; j++)
map[i][j] = read(), r = max(r, map[i][j]);
while(l + < r) {
mid = (l + r) >> ;
if(check(mid)) r = mid;
else l = mid;
}
printf("%d\n", r);
return ;
}
谢谢收看, 祝身体健康!
洛谷p1902刺杀大使题解的更多相关文章
- 洛谷 P1902 刺杀大使
刺杀大使 一道并不难的二分题,竟让我交了上20次,诶,果然还是我太弱了. 看完题目就基本想到要怎么做了: 只需要对最小伤害代价进行二分即可,check()函数里用搜索判断是否可以到达最后一行,这里的c ...
- 洛谷P1902 刺杀大使
题目 二分加广搜 #include <bits/stdc++.h> using namespace std; int n, m, l, r, p[1001][1001], vis[1001 ...
- 洛谷P2832 行路难 分析+题解代码【玄学最短路】
洛谷P2832 行路难 分析+题解代码[玄学最短路] 题目背景: 小X来到了山区,领略山林之乐.在他乐以忘忧之时,他突然发现,开学迫在眉睫 题目描述: 山区有n座山.山之间有m条羊肠小道,每条连接两座 ...
- 【洛谷P3960】列队题解
[洛谷P3960]列队题解 题目链接 题意: Sylvia 是一个热爱学习的女孩子. 前段时间,Sylvia 参加了学校的军训.众所周知,军训的时候需要站方阵. Sylvia 所在的方阵中有 n×m ...
- 洛谷P2312 解方程题解
洛谷P2312 解方程题解 题目描述 已知多项式方程: \[a_0+a_1x+a_2x^2+\cdots+a_nx^n=0\] 求这个方程在 \([1,m]\) 内的整数解(\(n\) 和 \(m\) ...
- 洛谷P1577 切绳子题解
洛谷P1577 切绳子题解 题目描述 有N条绳子,它们的长度分别为Li.如果从它们中切割出K条长度相同的 绳子,这K条绳子每条最长能有多长?答案保留到小数点后2位(直接舍掉2为后的小数). 输入输出格 ...
- 洛谷P2507 [SCOI2008]配对 题解(dp+贪心)
洛谷P2507 [SCOI2008]配对 题解(dp+贪心) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/1299251 链接题目地址:洛谷P2507 [S ...
- 洛谷 P1220 关路灯 题解
Description 有 $n$ 盏路灯,每盏路灯有坐标(单位 $m$)和功率(单位 $J$).从第 $c$ 盏路灯开始,可以向左或向右关闭路灯.速度是 $1m/s$.求所有路灯的最少耗电.输入保证 ...
- 【洛谷P3410】拍照题解(最大权闭合子图总结)
题目描述 小B有n个下属,现小B要带着一些下属让别人拍照. 有m个人,每个人都愿意付给小B一定钱让n个人中的一些人进行合影.如果这一些人没带齐那么就不能拍照,小B也不会得到钱. 注意:带下属不是白带的 ...
随机推荐
- python3 四舍五入(0.5可以进1)
今天做了一个题要求四舍五入,然后找了一个方法:round()可以四舍五入, 试了试1.5--->2 试了试0.5--->0 !!!! 找了几个方法说可以的: # 方法一: from _ ...
- 通过四个问题了解HTTP协议基础
很多人都知道学习和理解HTTP协议的重要性及必要性,但HTTP相关知识对计算机基础较差,尤其是我这种没有计算机基础的人来说更是晦涩难懂 乘着最近有空闲时间,开始恶补HTTP相关基础知识,下面请跟着我通 ...
- RabbitMQ实例C#
驱动组件.NET版本 官网推荐驱动:RabbitMQ.Client https://www.rabbitmq.com/devtools.html#dotnet-dev Connection和Chann ...
- Deep Learning专栏--强化学习之从 Policy Gradient 到 A3C(3)
在之前的强化学习文章里,我们讲到了经典的MDP模型来描述强化学习,其解法包括value iteration和policy iteration,这类经典解法基于已知的转移概率矩阵P,而在实际应用中,我们 ...
- spring boot中的日志入门
日志通常不会在需求阶段作为一个功能单独提出来,也不会在产品方案中看到它的细节.但是,这丝毫不影响它在任何一个系统中的重要地位. 报警系统与日志系统的关系 为了保证服务的高可用,发现问题一定要及时,定位 ...
- tomcat闪退的解决思路
用Tomcat总会遇到启动Tomcat闪退的问题. 什么叫闪退啊,就是闪一下,就退出了控制台. 都闪退了,为啥闪退也不知道呀,又没有错误信息,所以就要先阻止闪退,先看到错误信息,知道启动不起来的原因. ...
- Turbo码基本框架
1. 基本原理 1.1 定义 1.2 分量码设计 2. 编码方法 2.1 交织器的设计 2.2 分量编码器 2.3 删余矩阵及复用 3. 译码方法和算法 3.1 迭代译码 3.2 MAP类算法 3.3 ...
- 删除链表中的倒数第N个节点
题目 给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点. 示例: 给定一个链表: ->->->->, 和 n = . 当删除了倒数第二个节点后,链表变为 -&g ...
- SFTP 定时任务下载
1.上传 winscp.exe /console /command "option batch continue" "option confirm off" & ...
- HDU 2007-11 Programming Contest
Can you find it? Time Limit: 10000/3000 MS (Java/Others) Memory Limit: 32768/10000 K (Java/Others ...