Time Limit: 3000/1500 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 1534 Accepted Submission(s): 486
The first line of each case contains two integers N ,K (1 ≤ N ≤ 60,1 ≤ K ≤ N ),as mentioned above.
The next N lines, each lines contains two integer xi and yi (-109 ≤ xi, yi ≤ 109), denote the coordinates of city i.
题意:就是给你一系列点,让你挑k个点建造飞机场,然后求剩下点到最近的飞机场的最小的最大距离;距离定义:dij = |xi - xj| + |yi - yj|
我的思路是分别找出每个点到剩下点的距离,然后sort排序,找出每个城市第k大值的最小值;
大婶们说这是DLX可重复覆盖:
下面是大神的说法:
HDU 2295 Radar(DLX可重复覆盖)差不多,我们的做法就是 保存n个城市之间的距离,sort一下,二分结果,对满足条件的DLX求覆盖程度, 求出最大距离最小值。此题二分0~INF也可解决。http://www.2cto.com/kf/201412/364538.html
先把我的wa代码扔着,抽空补上。。。
wa代码:
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<vector> #include<algorithm> using namespace std; #define mem(x,y) memset(x,y,sizeof(x)) const int MAXN=1e5+10; int a[65][65]; int cmp(int a,int b){ return a>b; } struct Node{ int x,y; }; Node dt[65]; int getl(Node a,Node b){ return abs(a.x-b.x)+abs(a.y-b.y); } int main(){ int T,N,K,kase=0; scanf("%d",&T); while(T--){ scanf("%d%d",&N,&K); for(int i=0;i<N;i++){ scanf("%d%d",&dt[i].x,&dt[i].y); } for(int i=0;i<N;i++)for(int j=0;j<N;j++){ a[i][j]=getl(dt[i],dt[j]); } for(int i=0;i<N;i++)sort(a[i],a[i]+N,cmp); /* for(int i=0;i<N;i++){ for(int j=0;j<N;j++)printf("%d ",a[i][j]); puts(""); }*/ int mx=0x3f3f3f3f; for(int i=0;i<N;i++)mx=min(mx,a[i][K-1]); printf("Case #%d: %d\n",++kase,mx); } return 0; }