JZOJ 3428 【NOIP2013模拟】刺杀大使
2016-06-24 20:26
323 查看
原题
Description
伊朗伊斯兰革命卫队(某恐怖组织)正在策划一起刺杀行动,他们的目标是沙特驻美大使朱拜尔。他们来到了沙特驻美使馆,准备完成此次刺杀,要进入使馆首先必须通过使馆前的防御迷阵。迷阵一个由 n∗m 个相同的小房间组成,每个房间与相邻四个房间之间有门可通行。在第n行的m个房间里有m个机关,这些机关必须全部被打开才可以进入大使馆。而第1行的m个房间有m扇向外开的门,是迷阵的入口。除了第1行和第n行的房间外,每个房间都被使馆的安保人员安装了激光杀伤装置,将会对进入房间的人造成一定的伤害。第i行第j列造成的伤害值为 p[i][j](第1行和第n行的p值全部为0)。
现在伊斯兰革命卫队打算以最小伤害代价进入迷阵,打开全部机关,显然,他们可以选择任意多的人从任意的门进入,但必须到达第n行的每个房间。一个士兵受到的伤害值为他到达某个机关的路径上所有房间的伤害值中的最大值,整个部队受到的伤害值为所有士兵的伤害值中的最大值。现在,这个恐怖组织掌握了迷阵的情况,他们需要提前知道怎么安排士兵的行进路线可以使得整个部队的伤害值最小。
Input
第一行有两个整数n,m,表示迷阵的大小。接下来有n行,每行m个数,第i行第j列的数表示p[i][j]。
Output
输出一个数,表示最小伤害代价。Sample Input
4 20 0
3 5
2 4
0 0
Sample Output
3Data Constraint
50 %的数据, n,m≤100100 %的数据, n,m≤1000,p[i][j]≤1000
题解
所需算法
二分DFS
具体步骤
问题求最大值最小,这种题目首先应该二分答案Ans。把所有伤害值小于等于Ans的格子设为可通过。
再从第一排所有格子开始做一遍BFS
检查最后一排所有格子是否都能到达即可。
Code
#include<cstdio> #include<cstring> using namespace std; const int N=1001,way[4][2]={{1,0},{0,1},{-1,0},{0,-1}}; int n,m,r,mid,ans=N*N; int p ; bool bz ; inline int read() { int data=0; char ch=0; while(ch<'0' || ch>'9') ch=getchar(); while(ch>='0' && ch<='9') data=data*10+ch-'0',ch=getchar(); return data; }//读入优化 inline bool dfs(int x,int y) { if(x==n-1) return true; for(int i=0;i<4;i++) { int xx=x+way[i][0],yy=y+way[i][1]; if(xx<1 || xx>n || yy<1 || yy>m || bz[xx][yy] || p[xx][yy]>mid) continue; bz[xx][yy]=true; if(dfs(xx,yy)) return true; } return false; }//DFS int main() { n=read(),m=read(); for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) if((p[i][j]=read())>r) r=p[i][j];//上限 int l=1; while(l<r) { mid=(l+r)/2; memset(bz,false,sizeof(bz)); if(dfs(1,1)) r=mid,ans=(ans>mid)?mid:ans; else l=mid+1; }//二分 printf("%d",ans); return 0; }
相关文章推荐
- 【JZOJ 3851】reward
- 剑指offer-数据结构:数组和指针(基础知识)
- 115个Java面试题和答案——终极列表(下)
- 2016年暑假集训盲打首秀赛(我好菜...)
- !include: could not find: "nsProcess.nsh"
- Python 小练习 求list内中间数
- 一切都是对象 Thinking in Java 第二章
- ssm框架学习---基于eclipse中maven的ssm框架的搭建几个问题汇总
- Java中的Integer与int
- Servlet开发(三)Request对象常用方法、常见应用
- React学习资料
- 读取Unique reads
- linux 多线程 博客汇总
- 匈牙利算法
- 牛客网编程题:数组中缺失的最小正整数
- git版本管理
- Java的快速I/O
- 一周乱弹(0624 1,maven 添加依赖包.2,sqlserver 删除语句.3..OutOfMemoryError: PermGen space。4,SQL datediff (时间差)
- android实现登录一次,之后不需要登录的方法token,session,sharedpreference
- Pascal Mouse单元