刺杀大使

一道并不难的二分题,竟让我交了上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;
}

最新文章

  1. 设置centos7语言显示环境
  2. 附加数据库失败,sql2008,断电数据库日志受损
  3. Android使用SAX解析XML(1)
  4. js获取一个对象的所以属性和值
  5. 【EF】 proxy
  6. 一行代码实现iOS序列化与反序列化(runtime)
  7. 利用reverse索引优化like语句的方法详解
  8. ASP.NET Core 一步步搭建个人网站(6)_单页模式和优化
  9. 07--STL序列容器(Array)
  10. Elasticsearch+Mongo亿级别数据导入及查询实践
  11. Unity应用架构设计(9)——构建统一的 Repository
  12. 什么是pytorch(2Autograd:自动求导)(翻译)
  13. 能用HTML/CSS解决的问题,就不要用JS
  14. IDEA测试结果查看
  15. PHP Zend Email验证函数MailVal()函数的使用
  16. 2017ICPC南宁赛区网络赛 Overlapping Rectangles(重叠矩阵面积和=离散化模板)
  17. Python: 字符串搜索和匹配,re.compile() 编译正则表达式字符串,然后使用match() , findall() 或者finditer() 等方法
  18. java,JsonFormat格式化日期问题
  19. 特效Shader对雾的处理
  20. 遍历DataSet

热门文章

  1. js some和filter用法和区别
  2. c和c++字符串分割
  3. AQS与重入锁ReetrantLock原理
  4. ununtu 下安装 Nvidia 显卡驱动
  5. 使用Swing组件实现简单的进制转换
  6. Zeppelin推荐
  7. CF-831B
  8. C - Present
  9. C++中拷贝构造函数
  10. laravel 安装配置前准备