luogu 4047 部落划分 二分答案

二分距离判断是否满足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;
}

猜你喜欢

转载自www.cnblogs.com/asdic/p/9593500.html