首页 > 其他分享 >题解 P1902 刺杀大使

题解 P1902 刺杀大使

时间:2022-11-30 17:24:10浏览次数:46  
标签:二分 ch 题解 路径 刺杀 P1902 mid 开关 include

题解 P1902 刺杀大使

首先注意到,只需要到达一个开关,就可以开启所有开关(打开所有门)

所以我们就可以想到,我们要寻找一条从任意 \(1-m\) 开关(因为访问一个开关就可以开启所有开关,详情见看ps)到达 \(1-m\) 门的所有路径中伤害数最大值最小路径

很容易就想到了,最大值最小,明显是二分答案(伤害数),二分每条路径中的伤害数最大值

  • 如果路径中的伤害数大于二分的答案,说明此答案不满足,就将二分的答案调大,以此找到满足条件的路径
  • 如果满足条件,就试着找到更小的答案,将二分答案调小,寻找满足条件的路径

ps:看起来可能要遍历所有的开关来找到到达门的路径,实际上,因为开关的伤害数为 \(0\) ,所以可以直接从第一个开关开始 \(bfs\) ,借此访问到每个开关的同时,寻找路径的可能性,累计的最大伤害数都是 \(0\)


// #Tyrue#
#include<map>
#include<queue>
#include<cstdio>
#include<string>
#include<string.h>
#include<iostream>
using namespace std;
inline int read(){
    int x=0,f=1;char ch=getchar();
    while(ch<'0'||ch>'9'){
        if(ch=='-')f=-1;
        ch=getchar();
    }
    while(ch>='0' && ch<='9')
        x=x*10+ch-'0',ch=getchar();
    return x*f;
}
const int N=1e3+10;
int T,n,m,l=1e9,r=-1e9;
int a[N][N],vis[N][N];
int dx[5]{0,0,0,1,-1},dy[5]{0,1,-1,0,0};
struct Node{
    int x,y;
};
queue<Node> q;
bool bfs(int xz){
    memset(vis,0,sizeof vis);
    while(!q.empty()){
        q.pop();
    }
    q.push((Node){1,1});
    vis[0][0]=1;
    while(!q.empty()){
        Node f=q.front();
        q.pop();
        if(f.x==n){
            return 1;
        }
        for(int i=1;i<=4;i++){
            int xx=f.x+dx[i],yy=f.y+dy[i];
            if(xx<=n && xx>=1 && yy<=m && yy>=1 && !vis[xx][yy] && a[xx][yy]<=xz){
                q.push((Node){xx,yy});
                vis[xx][yy]=1;
            }
        }
    }
    return 0;
}
int main(){
    n=read(),m=read();
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            a[i][j]=read();
            l=min(l,a[i][j]);
            r=max(r,a[i][j]);
        }
    }
    int ans;
    // printf("%d %d\n",l,r);
    while(l<r){
        int mid=(l+r)>>1;
        // printf("%d %d %d\n",l,r,mid);
        if(bfs(mid)){
            r=mid;
            // ans=mid;
        }else{
            // printf("%d\n",l);
            l=mid+1;
        }
    }
    printf("%d",l); 
    return 0;
}

标签:二分,ch,题解,路径,刺杀,P1902,mid,开关,include
From: https://www.cnblogs.com/Tyrue-blog/p/16939129.html

相关文章

  • 你必须要知道的JavaScript数据结构与面试题解答
    英文原文|https://dev.to/educative/7-javascript-data-structures-you-must-know-4k0m原文作者|RyanThelin和AmandaFawcett译文翻译|web前端开发(web_qdkf)解决编码......
  • 【Java】Task07实验4第5题解析
    //TODO1:添加一个字段percent,用以表示百分秒privateintpercent;按照类的封装性要求,字段一般定义为私有的 //TODO2:添加一个只读属性getPercen......
  • 【题解】LOJ #6609 无意识的石子堆 - 感谢强大 alpha!!1【2】
    其实只有三个部分:环的EGF:\(\frac{1}{2}\sum\limits_{i\geq2}\frac{x^iy^i}{i}=\frac{1}{2}\left(\ln\frac{1}{1-xy}-xy\right)\)。链的EGF:\(\frac{1}{2}\frac{xy^2}......
  • 题解 UVA11244
    题解UVA11244题目大意:判断大小为1连通块有几个这个题说实话真的挺水的,你可以考虑用dfs来判断联通块然后记录大小这只是其中一个思路,另一个思路是,直接判断*的8连......
  • 题解 CF546C
    题解CF546Ccodeforces网址这个题看起来很难,其实是一个模拟题大体思路就是模拟每个人拿出手牌,并且比较,然后放入相应的人的手牌中的过程然后让我们想一下,如何才能便捷的......
  • 题解 CF1676G
    这个题标签里有树形dp,但是其实用dfs已经足以解决这道题。看这道题就可以发现这两道题其实是差不多的。首先需要给两个节点之间建边,我们需要从2到n循环输入。因为......
  • 题解 SP346
    题解SP346这个题的翻译貌似有点问题,这里的coins和goldcoins其实是一个东西有了这个前提,我们是再去看题面,就可以发现,这里的coins可以同时换成$\dfrac{n}{2}\\df......
  • 题解 CF1743B
    这个题是个简单的构造题因为不能有连续的“排列”,而排列序列都是必须是以\(1\)开头所以我们只要让\(2\)和\(1\)不相邻就能保证一个序列里只有它本身和\(1\)这两......
  • 题解 CF1370B
    题解CF1370B这个题跟脑筋急转弯一样诶\(gcd\)这个东西他有很多种可能性,但是如果我们考虑最简单的数字性质奇偶,就会发现,其实所有偶数的\(gcd\)都是\(2\)对吧所以,我......
  • 题解 CF471A
    题解CF471A这个题看题解都写得非常的冗余,不简洁,这里提供一种特别神奇的做法首先他需要我们判断这里是否有相同的数字,并且还要通过这个相同的个数来进行判断所以,我们可......