zoukankan      html  css  js  c++  java
  • WHYZOJ-#95 大逃亡(二分+BFS)(好题!!!)

    【题目描述】:

    给出数字N,X,Y,代表有N个敌人分布一个X行Y列的矩阵上,矩形的行号从0到X-1,列号从0到Y-1再给出四个数字x1,y1,x2,y2,代表你要从点(x1,y1)移到(x2,y2)。在移动的过程中你当然希望离敌人的距离的最小值最大化,现在请求出这个值最大可以为多少,以及在这个前提下,你最少要走多少步才可以回到目标点。注意这里距离的定义为两点的曼哈顿距离,即某两个点的坐标分为(a,b),(c,d),那么它们的距离为|a-c|+|b-d|。

    【输入描述】:

    第一行给出数字N,X,Y

    第二行给出x1,y1,x2,y2

    下面将有N行,给出N个敌人所在的坐标

    【输出描述】:

    在一行内输出你离敌人的距离及在这个距离的限制下,你回到目标点最少要移动多少步。

    【样例输入】:

    2 5 6
    0 0 4 0
    2 1
    2 3

    【样例输出】:

    2 14

    【时间限制、数据范围及描述】:

    时间:1s 空间:256M

    1<=N<=10000, 1<=X<=1000, 1<=Y<=1000

    实在是好题!!好久没有做过这么有质量的题了!!用苹果叶的话来说就是,这题又不难,你想把它做对有不润噫。首先第一个BFS预处理当时搞忘掉了QAQ,还有就是二分的时候有一些特殊情况要注意!夜深了,睡觉!

     1 #include "bits/stdc++.h"
     2 using namespace std;
     3 typedef long long LL;
     4 const int MAX=1005;
     5 int t,n,m;
     6 int xx,yy,x2,y2;
     7 int a[MAX][MAX];
     8 int dx[4]={-1,0,1,0};
     9 int dy[4]={0,1,0,-1};
    10 struct Poi{
    11     int x,y;
    12 };
    13 queue <Poi> q;
    14 inline int read(){
    15     int an=0,x=1;char c=getchar();
    16     while (c<'0' || c>'9') {if (c=='-') x=-1;c=getchar();}
    17     while (c>='0' && c<='9') {an=an*10+c-'0';c=getchar();}
    18     return an*x;
    19 }
    20 void init(){
    21     int i,j;
    22     Poi zt;
    23     t=read(),n=read(),m=read();
    24     xx=read(),yy=read(),x2=read(),y2=read();
    25     xx++,yy++,x2++,y2++;
    26     for (i=1;i<=n;i++)
    27         for (j=1;j<=m;j++)
    28             a[i][j]=100000000;
    29     for (i=1;i<=t;i++){
    30         zt.x=read();zt.y=read();
    31         zt.x++,zt.y++;
    32         a[zt.x][zt.y]=0;
    33         q.push(zt);
    34     }
    35     while (q.size()){
    36         Poi u=q.front(),v; q.pop();
    37         for (i=0;i<4;i++){
    38             v.x=u.x+dx[i];v.y=u.y+dy[i];
    39             if (v.x<1 || v.x>n || v.y<1 || v.y>m) continue;
    40             if (a[v.x][v.y]!=100000000) continue;
    41             a[v.x][v.y]=a[u.x][u.y]+1;
    42             q.push(v);
    43         }
    44     }
    45 }
    46 int vis[MAX][MAX];
    47 bool feasible(int x){
    48     int i,j;
    49     memset(vis,0,sizeof(vis));
    50     Poi zt,u,v;
    51     zt.x=xx,zt.y=yy;
    52     if (a[xx][yy]<x) return false;
    53     while (q.size()) q.pop();
    54     q.push(zt);
    55     while (q.size()){
    56         u=q.front();q.pop();
    57         for (i=0;i<4;i++){
    58             v.x=u.x+dx[i];v.y=u.y+dy[i];
    59             if (v.x<1 || v.x>n || v.y<1 || v.y>m) continue;
    60             if (a[v.x][v.y]<x || vis[v.x][v.y]) continue;
    61             vis[v.x][v.y]=vis[u.x][u.y]+1;
    62             q.push(v);
    63         }
    64     }
    65     return vis[x2][y2]>0;
    66 }
    67 int main(){
    68     freopen ("escape.in","r",stdin);
    69     freopen ("escape.out","w",stdout);
    70     int i,j,ans;
    71     init();
    72     int low=1,mid,high=n*m;
    73     while (low<=high){
    74         mid=(low+high)>>1;
    75         if (feasible(mid)){
    76             low=mid+1;
    77             ans=vis[x2][y2];
    78         }
    79         else
    80             high=mid-1;
    81     }
    82     if (low-1==0){
    83         feasible(0);
    84         printf("0 %d",vis[x2][y2]);
    85     }
    86     else
    87         printf("%d %d",low-1,ans);
    88     return 0;
    89 }
    未来是什么样,未来会发生什么,谁也不知道。 但是我知道, 起码从今天开始努力, 肯定比从明天开始努力, 要快一天实现梦想。 千里之行,始于足下! ——《那年那兔那些事儿》
  • 相关阅读:
    无法添加sql server ER图
    我和COC
    WordPress怎样设置菜单栏旋转小图标
    VS Code怎样设置成中文
    初探 Git Submodules
    使用 rsync-deploy-action 同步 Hexo 博客到个人服务器
    Latex基本语法简记
    SQLAlchemy建立数据库模型之间的关系
    Flask的请求钩子与上下文简览
    如何将本地项目推送到Github
  • 原文地址:https://www.cnblogs.com/keximeiruguo/p/7508163.html
Copyright © 2011-2022 走看看