洛谷 P1902 刺杀大使
刺杀大使
一道并不难的二分题,竟让我交了上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 刺杀大使的更多相关文章
- 洛谷p1902刺杀大使题解
题目传送门 方法:二分答案+dfs 二分一个mid,此次刺杀的最大伤害,作为判断条件来dfs,二分,更新. 我们二分一个答案mid来表示一个界限,如果当前这个格子的伤害代价比mid小则可以走否则就不走 ...
- 洛谷P1902 刺杀大使
题目 二分加广搜 #include <bits/stdc++.h> using namespace std; int n, m, l, r, p[1001][1001], vis[1001 ...
- P1902 刺杀大使
题目描述 伊朗伊斯兰革命卫队(某恐怖组织)正在策划一起刺杀行动,他们的目标是沙特驻美大 使朱拜尔.他们来到了沙特驻美使馆,准备完成此次刺杀,要进入使馆首先必须通过使馆前 的防御迷阵. 迷阵由 n*m ...
- 二分+Dfs【p1902】刺杀大使
题目描述--->p1902 刺杀大使 题意概括: 找一条路径,使得从第1行到第n行路径的最大值最小. 分析: 题目概括出来,很容易想到二分. 求最大值最小,因此我们可以对最大伤害值进行二分. 如 ...
- 洛谷1640 bzoj1854游戏 匈牙利就是又短又快
bzoj炸了,靠离线版题目做了两道(过过样例什么的还是轻松的)但是交不了,正巧洛谷有个"大牛分站",就转回洛谷做题了 水题先行,一道傻逼匈牙利 其实本来的思路是搜索然后发现写出来类 ...
- 洛谷P1352 codevs1380 没有上司的舞会——S.B.S.
没有上司的舞会 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description Ural大学有N个职员,编号为1~N.他们有 ...
- 洛谷P1108 低价购买[DP | LIS方案数]
题目描述 “低价购买”这条建议是在奶牛股票市场取得成功的一半规则.要想被认为是伟大的投资者,你必须遵循以下的问题建议:“低价购买:再低价购买”.每次你购买一支股票,你必须用低于你上次购买它的价格购买它 ...
- 洛谷 P2701 [USACO5.3]巨大的牛棚Big Barn Label:二维数组前缀和 你够了 这次我用DP
题目背景 (USACO 5.3.4) 题目描述 农夫约翰想要在他的正方形农场上建造一座正方形大牛棚.他讨厌在他的农场中砍树,想找一个能够让他在空旷无树的地方修建牛棚的地方.我们假定,他的农场划分成 N ...
- 洛谷P1710 地铁涨价
P1710 地铁涨价 51通过 339提交 题目提供者洛谷OnlineJudge 标签O2优化云端评测2 难度提高+/省选- 提交 讨论 题解 最新讨论 求教:为什么只有40分 数组大小一定要开够 ...
随机推荐
- Turn your Session into FlushMode.COMMIT/AUTO or remove 'readOnly' marker from transaction definition.
- HTTP Status 500 - Write operations are not allowed in read-only mode (FlushMode.MANUAL): Turn your Session into FlushMode.COMMIT/AUTO or remove 'readOnly' marker from transaction definition.
如果在service类上面没有添加注解,出现异常 @Transactional
- 解决js 运算 精度缺失
github地址: https://github.com/MikeMcl/big.js
- bzoj3832
拓扑排序+set 如果我们直接记录所有路径是不行的,那么我们要降低路径的数量,于是我们把最短路径转换到边上,这样我们就只有m条路径了. 先计算出f[i]和g[i]表示正反拓扑最长链,把所有g插到set ...
- 关于 jwTextFiled 的使用说明
我在些项目中多次对一些输入框做了相同的代码操作,终于有一天忍不住了,MD必须写一个小的框架解决这个搬砖的问题.经过一天的战斗,于是 jwTextFied 就默默的诞生了. 地址:https://git ...
- 使用escape、encodeURI 和 encodeURIComponent 解决url中文乱码问题
escape(), encodeURI()和encodeURIComponent()是在Javascript中用于编码字符串的三个常用的方法,而他们之间的异同却困扰了很多的Javascript初学者, ...
- linux磁盘存储管理基本命令和工具
1 磁盘在linux表示方法 (1) IDE硬盘:hd[a~z]x,主设备号+次设备号+磁盘分区编号/hd(0-n,y) (2)SCSI硬盘:sd[a~z]x/hd(0-n,y) 注:主设备号可以唯一 ...
- jquery的on()绑定无效的方式
on前面的元素也必须在页面加载的时候就存在于dom里面.动态的元素或者样式等,可以放在on的第二个参数里面 jQuery on()方法是官方推荐的绑定事件的一个方法.使用 on() 方法可以给将来动态 ...
- CSS3:nth-child()伪类选择器,Table表格奇偶数行定义样式
转自爱设计 原文链接http://www.dangshopex.com/jishufenxiang/WEBkaifajishu/8653.html CSS3的强大,让人惊叹,人们在惊喜之余,又不得不为 ...
- __doPostBack方法解析 __VIEWSTATE __EVENTTARGET __doPostBack __EVENTARGUMENT
关于这个的另一篇博客:http://www.cnblogs.com/Silicon-Fado/archive/2009/04/21/1440437.html __VIEWSTATE:页面状态信息在客户 ...