二分距离判断是否满足k个部落,注意double类型精度,可使用不开方,最终再开
#include<bits/stdc++.h> #define rep(i,x,y) for(register int i=x;i<=y;i++) #define dec(i,x,y) for(register int i=x;i>=y;i--) #define eps 1e-4 using namespace std; const int N=1050; inline int read(){ int x=0,f=1;char ch=getchar(); while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();} while(isdigit(ch)){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();} return x*f;} int n,k,x[N],y[N],mx,my,fa[N]; inline int find(int x){ return fa[x]==x?x:fa[x]=find(fa[x]);} inline int S(int x){return x*x;} inline double dis(int i,int j){ return S(x[j]-x[i])+S(y[j]-y[i]);} bool check(double mid){ rep(i,1,n) fa[i]=i;int cnt=0; rep(i,1,n)rep(j,1,n) if(dis(i,j)<=mid){ int xx=find(i),yy=find(j); if(xx!=yy) fa[xx]=yy;} rep(i,1,n) if(find(i)==i) cnt++; if(cnt<k) return 0;return 1;} int main(){ double mx=0.0,my=0.0; n=read();k=read(); rep(i,1,n){ x[i]=read();y[i]=read(); mx=mx>x[i]?mx:x[i]; my=my>y[i]?my:y[i];} double l=0.00,r=S(mx)+S(my),mid; while(r-l>eps){ mid=(l+r)*0.5; if(check(mid)) l=mid; else r=mid;} printf("%.2lf\n",sqrt(l));return 0; }