zoukankan      html  css  js  c++  java
  • 宁波多校(四) C石头划分(二分)

    看到最小最大,显然是经典二分

    因此只需要枚举最大距离进行check

    如果能存在k组或以上能满足组间距离大于等于mid

    那么就可以放大,否则缩小

    #include<iostream>
    #include<algorithm>
    #include<stack>
    #include<vector>
    #include<cstring>
    #include<set>
    #include<map>
    using namespace std;
    typedef long long ll;
    const int N=3e5+10;
    const int INF=0x3f3f3f3f;
    int n,k;
    int cnt;
    int vis[N];
    double x[N],y[N];
    double dis[1005][1005];
    void dfs(int u,double x){
        int i;
        for(i=1;i<=n;i++){
            if(dis[u][i]<x&&!vis[i]){
                vis[i]=1;
                dfs(i,x);
            }
        }
    }
    bool check(double x){
        int cnt=0;
        memset(vis,0,sizeof vis);
        for(int i=1;i<=n;i++){
            if(!vis[i]){
                cnt++;
                dfs(i,x);
            }
        }
        return cnt>=k;
    }
    int main(){
        //ios::sync_with_stdio(false);
        cin>>n>>k;
        int i;
        for(i=1;i<=n;i++){
            cin>>x[i]>>y[i];
        }
        double mx=0;
        int j;
        for(i=1;i<=n;i++){
            for(j=1;j<=n;j++){
                if(i!=j)
                dis[i][j]=sqrt((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]));
                mx=max(dis[i][j],mx);
            }
        }
        double l=0,r=mx;
        while(r-l>0.0001){
            double mid=(l+r)/2;
            if(check(mid))
                l=mid;
            else
                r=mid;
        }
        printf("%.2f
    ",l);
    }
    View Code
  • 相关阅读:
    c语言中逆向显示数值
    c语言中无限循环语句
    css静态网页css代码
    css静态网页css代码
    考试html代码
    考试css代码
    考试html框架代码
    css静态网页代码
    5个CSS书写技巧
    5个CSS书写技巧
  • 原文地址:https://www.cnblogs.com/ctyakwf/p/13276841.html
Copyright © 2011-2022 走看看