标签:col logs stdin family type 注意 names soft pac
给出数字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 }
标签:col logs stdin family type 注意 names soft pac
原文地址:http://www.cnblogs.com/keximeiruguo/p/7508163.html