刺杀大使

一道并不难的二分题,竟让我交了上20次,诶,果然还是我太弱了。

看完题目就基本想到要怎么做了:

只需要对最小伤害代价进行二分即可,check()函数里用搜索判断是否可以到达最后一行,这里的check()用深搜广搜都可以,两种的代码下面都会给出,而经过检验,这道题目用深搜会优于广搜。

如果你不像我一般手滑的话,此题基本就可以过了。

然而,导致我反复提交20遍的原因,不是二分答案时卡循环的问题,而是,,,

数组开小了

这也给我提了个醒,不是所有的re都是二分循环的锅,有时候要考虑数组越界的问题。

用汝佳julao的话说,就是 : 编写一个尽量鲁棒的程序!!!

code:

深搜做法(更优):

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
//Mystery_Sky
//
#define M 2000
#define INF 0x7f7f7f7f
const int dx[] = {0, 0, 1, -1};
const int dy[] = {1, -1, 0, 0};
int l, r, mid;
bool vis[M][M], flag;
int n, m, a[M][M];
void check(int x, int y, int ans)
{
if(x == n) {
flag = true;
}
for(int i = 0; i <= 3; i++) {
int xx = x + dx[i];
int yy = y + dy[i];
if(xx <= 0 || yy <= 0 || xx > n || yy > m || a[xx][yy] > ans || vis[xx][yy]) continue;
vis[xx][yy] = 1;
check(xx, yy, ans);
if(flag) return;
} } int main() {
scanf("%d%d", &n, &m);
for(int i = 1; i <= n; i++)
for(int j = 1; j <= m; j++)
scanf("%d", &a[i][j]), r = max(r, a[i][j]);
l = 0;
while(l <= r) {
mid = (l+r)/2;
memset(vis, 0, sizeof(vis));
flag = 0;
check(1, 1, mid);
if(flag) r = mid - 1;
else l = mid + 1;
}
printf("%d\n", l);
return 0;
}

广搜做法:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;
//Mystery_Sky
//
#define M 2000
#define INF 0x7f7f7f7f
struct node{
int x, y;
};
int n, m, p[M][M];
int l, r, mid, maxx;
int vis[M][M];
int dx[] = {0, 0, 1, -1};
int dy[] = {1, -1, 0, 0};
int Ans;
inline bool check(int ans)
{
memset(vis, 0, sizeof(vis));
queue <node> q;
q.push((node){1, 1});
while(!q.empty()) {
node top = q.front();
q.pop();
int x, y;
for(int i = 0; i <= 3; i++) {
x = top.x + dx[i];
y = top.y + dy[i];
if(x <= 0 || y <= 0 || x > n || y > m || p[x][y] > ans || vis[x][y]) continue;
vis[x][y] = 1;
q.push((node){x, y});
if(x == n) 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", &p[i][j]);
l = 0, r = 1024;
while(l < r) {
mid = (l+r)>>1;
if(check(mid)) {
r = mid;
}
else l = mid+1;
}
printf("%d\n", l);
return 0;
}

洛谷 P1902 刺杀大使的更多相关文章

  1. 洛谷p1902刺杀大使题解

    题目传送门 方法:二分答案+dfs 二分一个mid,此次刺杀的最大伤害,作为判断条件来dfs,二分,更新. 我们二分一个答案mid来表示一个界限,如果当前这个格子的伤害代价比mid小则可以走否则就不走 ...

  2. 洛谷P1902 刺杀大使

    题目 二分加广搜 #include <bits/stdc++.h> using namespace std; int n, m, l, r, p[1001][1001], vis[1001 ...

  3. P1902 刺杀大使

    题目描述 伊朗伊斯兰革命卫队(某恐怖组织)正在策划一起刺杀行动,他们的目标是沙特驻美大 使朱拜尔.他们来到了沙特驻美使馆,准备完成此次刺杀,要进入使馆首先必须通过使馆前 的防御迷阵. 迷阵由 n*m ...

  4. 二分+Dfs【p1902】刺杀大使

    题目描述--->p1902 刺杀大使 题意概括: 找一条路径,使得从第1行到第n行路径的最大值最小. 分析: 题目概括出来,很容易想到二分. 求最大值最小,因此我们可以对最大伤害值进行二分. 如 ...

  5. 洛谷1640 bzoj1854游戏 匈牙利就是又短又快

    bzoj炸了,靠离线版题目做了两道(过过样例什么的还是轻松的)但是交不了,正巧洛谷有个"大牛分站",就转回洛谷做题了 水题先行,一道傻逼匈牙利 其实本来的思路是搜索然后发现写出来类 ...

  6. 洛谷P1352 codevs1380 没有上司的舞会——S.B.S.

    没有上司的舞会  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond       题目描述 Description Ural大学有N个职员,编号为1~N.他们有 ...

  7. 洛谷P1108 低价购买[DP | LIS方案数]

    题目描述 “低价购买”这条建议是在奶牛股票市场取得成功的一半规则.要想被认为是伟大的投资者,你必须遵循以下的问题建议:“低价购买:再低价购买”.每次你购买一支股票,你必须用低于你上次购买它的价格购买它 ...

  8. 洛谷 P2701 [USACO5.3]巨大的牛棚Big Barn Label:二维数组前缀和 你够了 这次我用DP

    题目背景 (USACO 5.3.4) 题目描述 农夫约翰想要在他的正方形农场上建造一座正方形大牛棚.他讨厌在他的农场中砍树,想找一个能够让他在空旷无树的地方修建牛棚的地方.我们假定,他的农场划分成 N ...

  9. 洛谷P1710 地铁涨价

    P1710 地铁涨价 51通过 339提交 题目提供者洛谷OnlineJudge 标签O2优化云端评测2 难度提高+/省选- 提交  讨论  题解 最新讨论 求教:为什么只有40分 数组大小一定要开够 ...

随机推荐

  1. 【UVA12779占位】Largest Circle

    几何题,希望有时间回来解决掉.

  2. IO多路复用模型之select()函数详解

    IO复用 我们首先来看看服务器编程的模型,客户端发来的请求服务端会产生一个进程来对其进行服务,每当来一个客户请求就产生一个进程来服务,然而进程不可能无限制的产生,因此为了解决大量客户端访问的问题,引入 ...

  3. springmvc源码分析系列-请求处理流程

    接上一篇-springmvc源码分析开头片 上一节主要说了一下springmvc与struts2的作为MVC中的C(controller)控制层的一些区别及两者在作为控制层方面的一些优缺点.今天就结合 ...

  4. linux之打包压缩命令

    tar:主选项:[一条命令以下5个参数只能有一个]-c: --create 新建一个压缩文档,即打包-x: --extract,--get解压文件-t: --list,查看压缩文档里的文件目录-r:- ...

  5. 2 pyspark学习----基本操作

    1 spark的python环境部署可以参照上面一篇哟.http://www.cnblogs.com/lanjianhappy/p/8705974.html 2 pyspark的基本操作. # cod ...

  6. 为Docker容器设置静态IP

    此文已由作者袁欢授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 创建docker容器 docker run -it --name=yh -h yh --net=none de ...

  7. ComDom在使用函数CompileAssemblyFromFile时无法找到文件的错误

    public virtual CompilerResults CompileAssemblyFromFile( CompilerParameters options, params string[] ...

  8. 【OpenJ_Bailian - 2797】最短前缀(贪心)

    最短前缀 Descriptions: 一个字符串的前缀是从该字符串的第一个字符起始的一个子串.例如 "carbon"的字串是: "c", "ca&qu ...

  9. Execution failed for task ':app:installDebug'.

    解决方案:重新起服务(react-native start),重新起项目(react-native run-android)

  10. 最长上升序列(Lis)

    Description A numeric sequence of ai is ordered if a1 < a2 < ... < aN. Let the subsequence ...