• [HAOI2006] 聪明的猴子


    求给定的一组数中,不小于点集生成树中最长边距的有多少个。

    Solution

    裸题。

    #include <bits/stdc++.h>
    using namespace std;
    #define int long long
    const int N = 2005;
    struct edge {
        int u,v;
        double w;
        bool operator < (const edge &b) {
            return w<b.w;
        }
    } e[N*N];
    
    int n,m,x[N],y[N],fa[N],a[N];
    int find(int p) {
        return fa[p]==p?p:fa[p]=find(fa[p]);
    }
    void merge(int p,int q) {
        p=find(p);
        q=find(q);
        if(p-q) fa[p]=q;
    }
    
    signed main() {
        cin>>n;
        for(int i=1;i<=n;i++) cin>>a[i];
        cin>>m;
        for(int i=1;i<=m;i++) cin>>x[i]>>y[i];
        int ind=0;
        for(int i=1;i<=m;i++) {
            for(int j=1;j<i;j++) {
                e[++ind]=(edge){i,j,sqrt((x[i]-x[j])*(x[i]-x[j])+
                            (y[i]-y[j])*(y[i]-y[j]))};
            }
        }
        sort(e+1,e+ind+1);
        double tmp = 0;
        for(int i=1;i<=m;i++) fa[i]=i;
        for(int i=1;i<=ind;i++) {
            if(find(e[i].u)!=find(e[i].v)) {
                merge(e[i].u,e[i].v);
                tmp=max(tmp,e[i].w);
            }
        }
        int ans=0;
        for(int i=1;i<=n;i++) if(a[i]>=tmp) ++ans;
        cout<<ans;
    }
    
    
  • 相关阅读:
    软考
    十步走-阅读笔记
    软著申请
    十步走-阅读笔记
    基于Ubuntu安装部署ZooKeeper
    基于Ubuntu安装JDK(OPenJDK8)
    Intern Day89
    阿里巴巴Java研发工程师技术一面
    面试
    6_moc.md
  • 原文地址:https://www.cnblogs.com/mollnn/p/12384927.html
Copyright © 2020-2023  润新知