洛谷P1902 刺杀大使 题解
1.洛谷P1028 [NOIP 2001 普及组] 数的计算 题解2.洛谷P1464 Function 题解3.洛谷P2440 木材加工 题解4.洛谷P2678 [NOIP 2015 提高组] 跳石头 题解5.洛谷P1314 [NOIP 2011 提高组] 聪明的质监员 题解6.洛谷P1083 [NOIP 2012 提高组] 借教室 题解
7.洛谷P1902 刺杀大使 题解
8.洛谷P1873 [COCI 2011/2012 #5] EKO / 砍树 题解9.洛谷P2280 [HNOI2003] 激光炸弹 题解10.洛谷P8218 【深进1.例1】求区间和 题解11.洛谷 P1719 最大加权矩形 题解12.洛谷 P2367 语文成绩 题解13.洛谷P1387 最大正方形 题解14.洛谷P1014[NOIP 1999 普及组] Cantor 表 题解15.洛谷P1563 [NOIP 2016 提高组] 玩具谜题 题解16.洛谷P4924 [1007] 魔法少女小Scarlet 题解17.洛谷P1518 [USACO2.4] 两只塔姆沃斯牛 The Tamworth Two 题解18.洛谷P1786 帮贡排序 题解19.洛谷P1990 覆盖墙壁 题解20.洛谷P1010 [NOIP 1998 普及组] 幂次方 题解21.洛谷P1259 黑白棋子的移动 题解22.洛谷P1281 书的复制 题解23.洛谷P1396 营救 题解24.洛谷PP1570 KC 喝咖啡25.洛谷P1661 扩散 题解26.洛谷P1843 奶牛晒衣服 题解P1902 刺杀大使 题解
题目
题解
思路
这一题我们可以使用二分答案+BFS的解法。
我们二分整个部队受到的伤害最小值\(x\),每次使用\(check(int\ x)\)函数用于检验是否可以在最小值为\(x\)的情况下到达第\(n\)行。
随后就是BFS的板子了,从(1,1)开始BFS,每次记录一下\(vis[x][y]=1\)(防止重复搜索,避免MLE风险),如果搜索到了第\(n\)行则直接返回true,否则在循环结束时返回false。
在二分循环内根据\(check\)的返回值进行相对应的\(l\)和\(r\)的调整即可。
代码
#include<bits/stdc++.h> #define endl '\n' using namespace std; int n,m,p[1005][1005]; int fx[5]={0,0,1,0,-1}; int fy[5]={0,1,0,-1,0}; bool vis[1005][1005]={0}; inline bool check(int t){ memset(vis,0,sizeof(vis)); int mnp=1005; pair<int,int> start={1,1}; queue<pair<int,int>> q; q.push(start); vis[1][1]=1; while(!q.empty()){ start=q.front(); q.pop(); int x=start.first,y=start.second; int tx,ty; if(x==n){ return 1; } for(int i=1;i<=4;i++){ tx=x+fx[i]; ty=y+fy[i]; if(tx>=1&&tx<=n&&ty>=1&&ty<=m&&!vis[tx][ty]&&p[tx][ty]<=t){ vis[tx][ty]=1; q.push({tx,ty}); } } } return 0; } int main(){ cin>>n>>m; for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ cin>>p[i][j]; } } int l=0,r=1001; while(l+1<r){ int mid=l+((r-l)>>1); if(check(mid)) r=mid; else l=mid; } cout<<r<<endl; return 0; }
本文作者:2789617221guo
本文链接:https://www.cnblogs.com/2789617221guo/p/18703259
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步