1 条题解

  • 6
    @ 2024-5-26 12:01:32
    #include<cstdio>
    #include<algorithm>
    using namespace std;
    
    struct point{
        int x, y;
    }pt[100010];
    
    struct edge{
        int u,  v, dis;
    }ed[1000010];
    
    int num=0,n,m,t=0,lim=0;
    int a[100010],book[1000010],f[1000010];
    int etot=0;
    
    bool cmp(const edge &a, const edge &b){
        return a.dis<b.dis;
    }
    
    int caldis(int i,int j){
        return (pt[i].x-pt[j].x) * (pt[i].x-pt[j].x) + (pt[i].y-pt[j].y) * (pt[i].y - pt[j].y);
    }
    
    void add(int u,int v){
        ed[++num].u=u;
        ed[num].v=v;
        ed[num].dis=caldis(u,v);
    }
    
    int getfather(int x){
        if(x == f[x]) return x;
        return f[x]=getfather(f[x]);
    }
    
    void Kruscal(){
        sort(ed+1, ed+num+1, cmp);
        for(int i=1; i<=n; i++) f[i] = i;
        for(int i=1; i<=num; i++){
            int y=getfather(ed[i].u);
            int x=getfather(ed[i].v);
            if(x != y){
                ++etot;
                f[y] = x;   
            }
            if(etot==n-1) {//完成的一棵树 
               lim=ed[i].dis;//最大的边 
               break;   
            }
        }
    }
    
    int main(){//前面函数编写完成,我们开始运用吧
        scanf("%d", &m);//输入猴子个数
        for(int i=1; i<=m; i++)
            scanf("%d", &a[i]);//输入每只猴子最大跳跃距离
        scanf("%d", &n);//输入树的总数
        for(int i=1; i<=n; i++)
            scanf("%d%d", &pt[i].x, &pt[i].y);//输入第N+3行为N棵树的坐标
        for(int i=1; i<n; i++)
            for(int j=i+1; j<=n; j++)
                add(i, j);
        Kruscal();
        for(int i=1; i<=m; i++)
            if(a[i] * a[i] >= lim) t++;//统计 
        printf("%d\n", t);//输出
        return 0;
    }
    

    不完全是自己写的,有些是看书写,非常的完美,已AC

    • 1

    信息

    ID
    1885
    时间
    1000ms
    内存
    256MiB
    难度
    5
    标签
    递交数
    141
    已通过
    53
    上传者