题目描述--->p1902 刺杀大使

题意概括:

找一条路径,使得从第1行到第n行路径的最大值最小。

分析:

题目概括出来,很容易想到二分.

求最大值最小,因此我们可以对最大伤害值进行二分。

如果某位置所受伤害值大于我们当前所限制的伤害值,我们肯定是不走这条路的.

栗子:

我们限制最大伤害为5

搜索到某一行发现伤害值是这样的--> 8 8 8 8。

这样我们是无法通过这一行的。

做法:

我们需要标记是否能以当前限制的伤害值走到最后一行,如果可以我们就去寻求更小伤害,如果不能我们只能去寻求较小伤害(实际上是更大了)。

以标记作为更新边界的标准.

所以很容易写出二分代码↓

int l=0,r=1008;
//这里右边界赋为了极大值
//数据保证了每个位置伤害值不超过1000
//也可以把右边界赋值为当前图中最大伤害值.
while(l<=r)//一般套路
{
int mid=l+r>>1;
memset(vis,0,sizeof vis);
flg=false;
dfs(1,1,mid);
if(flg==true)//flg为true视为能到达最后一行
r=mid-1;//因此我们更新右边界,寻求更小值
else l=mid+1;
}

搜索部分代码如何去写?

没什么需要特别注意的地方。

需要判断:是否超出边界,是否遍历过,伤害值是否能满足限制条件.

我写出来是这个样子的↓

IL void dfs(int x,int y,int mid)
{
if(x==n)
{
flg=1;
return;
}
vis[x][y]=true;
for(RI i=0,xx,yy;i<4;++i)
{
xx=x+ax[i],yy=y+ay[i];
//ax,ay数组为搜索的一般设置套路.代表四个方向
//const int ax[]={0,1,0,-1};
//const int ay[]={1,0,-1,0};
if(xx<1 or xx>n or yy<1 or yy>m or vis[xx][yy] or p[xx][yy]>mid)//一连串判断
//这里的 or 与 || 是一样的
continue;
dfs(xx,yy,mid);
if(flg)
return;
}
}

一点时间优化

我们可以不必将vis数组重置,而去判断是第几次经过.

--------------------代码---------------------

#include<bits/stdc++.h>
#define IL inline
#define RI register int
#define mod 100000
IL void read(int &x){
int f=1;x=0;char s=getchar();
while(s>'9'||s<'0'){if(s=='-')f=-1;s=getchar();}
while(s<='9'&&s>='0'){x=x*10+s-'0';s=getchar();}
x*=f;
}
int n,m,p[1008][1008],tm;
const int ax[]={0,1,0,-1};
const int ay[]={1,0,-1,0};
bool flg,vis[1008][1008];
IL void dfs(int x,int y,int mid)
{
if(x==n)
{
flg=1;
return;
}
vis[x][y]=true;
for(RI i=0,xx,yy;i<4;++i)
{
xx=x+ax[i],yy=y+ay[i];
if(xx<1 or xx>n or yy<1 or yy>m or vis[xx][yy] or p[xx][yy]>mid)
continue;
dfs(xx,yy,mid);
if(flg)
return;
}
}
int main()
{
read(n),read(m);
for(RI i=1;i<=n;i++)
for(RI j=1;j<=m;j++)
read(p[i][j]);
int l=0,r=1008;
while(l<=r)
{
int mid=l+r>>1;
memset(vis,0,sizeof vis);
flg=false;
dfs(1,1,mid);
if(flg==true)
r=mid-1;
else l=mid+1;
}
printf("%d",l);
}

二分+Dfs【p1902】刺杀大使的更多相关文章

  1. 洛谷 P1902 刺杀大使

    刺杀大使 一道并不难的二分题,竟让我交了上20次,诶,果然还是我太弱了. 看完题目就基本想到要怎么做了: 只需要对最小伤害代价进行二分即可,check()函数里用搜索判断是否可以到达最后一行,这里的c ...

  2. 洛谷p1902刺杀大使题解

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

  3. P1902 刺杀大使

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

  4. 洛谷P1902 刺杀大使

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

  5. Codeforces Round #381 (Div. 2)D. Alyona and a tree(树+二分+dfs)

    D. Alyona and a tree Problem Description: Alyona has a tree with n vertices. The root of the tree is ...

  6. [BZOJ 1082] [SCOI2005] 栅栏 【二分 + DFS验证(有效剪枝)】

    题目链接:BZOJ - 1082 题目分析 二分 + DFS验证. 二分到一个 mid ,验证能否选 mid 个根木棍,显然要选最小的 mid 根. 使用 DFS 验证,因为贪心地想一下,要尽量先用提 ...

  7. 51nod1307(暴力树剖/二分&dfs/并查集)

    题目链接: http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1307 题意: 中文题诶~ 思路: 解法1:暴力树剖 用一个数 ...

  8. 【BZOJ】1082: [SCOI2005]栅栏(二分+dfs)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1082 题意:n个给出木板,m个给出木板.可以将那m个木板锯成泥想要的长度.问最大能锯成多少个给出的n ...

  9. 【BZOJ】1146: [CTSC2008]网络管理Network(树链剖分+线段树套平衡树+二分 / dfs序+树状数组+主席树)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1146 第一种做法(时间太感人): 第二种做法(rank5,好开心) ================ ...

随机推荐

  1. 我用JAVA做了个简易图像相似度计算器

    简单说两句: 笔主利用这个七夕前后两天的寂寞时光,用JAVA磨了一个简单的图像相似度计算小程序,就在刚才终于纠结完毕,输出了1.0版本,小小的满足了一下可怜的虚荣心..→_→ 使用最简单最基础的感知哈 ...

  2. JUnit4.11 理论机制 @Theory 完整解读

    最近在研究JUnit4,大部分基础技术都是通过百度和JUnit的官方wiki学习的,目前最新的发布版本是4.11,结合代码实践,发现官方wiki的内容或多或少没有更新,Theory理论机制章节情况尤为 ...

  3. 使用setTimeout延时10ms执行onunloadcancel

    在做Web开发时,我们经常用到页面关闭事件onbeforeunload,可以给用户一个选择放弃关闭的机会,就比如这个博客编辑器.如果用户选择了离开,那么onunload事件自然会触发:但若用户选择了取 ...

  4. 使用XTU降低CPU功耗,自动执行不失效

    INTEL出品的XTU可以用来做软超频操作,给CPU/GPU加电压超频,也可以通过降低CPU/GPU电压来减少功耗. 以前用XTU设置好了之后,过一段时间就自动失效了,最近失效的频率突然很高,于是找了 ...

  5. POJ2195:Going Home (最小费用最大流)

    Going Home Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 26212   Accepted: 13136 题目链接 ...

  6. Eclipse来push,fetch,rebase代码

    如何与项目里的其他人一起合作项目,提交代码并更新呢?这里提出我比最近用到的两种工具:一种是Eclipse,另外一个是SourceTree.个人推荐从事Java开发的话,可以用Eclipse.当然,还有 ...

  7. DSP投放进阶指南

  8. rsync 同步

    1./usr/bin/rsync -vzrtopg --progress  --include "weibo-service-server" --exclude "/*& ...

  9. Step-By-Step: Setting up Active Directory in Windows Server 2016

    There are interesting new features now made available in Windows Server 2016 such as time based grou ...

  10. barba.js 优化页面跳转用户体验

    barba.js 原理就是在a页面中显示b页面的内容,样式为刷新,给用户以页面跳转后无刷新体验,注意样式命名,ab页面引用的样式和js要相同 可以在页面之间创建良好的转换,增强用户的体验. 减少HTT ...