可惜没如果=_=
时光的河入海流

【题目描述】:

给出数字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 }

 

posted on 2017-09-12 02:30  珍珠鸟  阅读(220)  评论(0编辑  收藏  举报