• BZOJ2429[HAOI2006]聪明的猴子[最小生成树 kruskal]


    2429: [HAOI2006]聪明的猴子

    Time Limit: 10 Sec  Memory Limit: 128 MB
    Submit: 896  Solved: 575
    [Submit][Status][Discuss]

    Description

    在一个热带雨林中生存着一群猴子,它们以树上的果子为生。昨天下了一场大雨,现在雨过天晴,但整个雨林的地表还是被大水淹没着,部分植物的树冠露在水面上。猴子不会游泳,但跳跃能力比较强,它们仍然可以在露出水面的不同树冠上来回穿梭,以找到喜欢吃的果实。
    现在,在这个地区露出水面的有N棵树,假设每棵树本身的直径都很小,可以忽略不计。我们在这块区域上建立直角坐标系,则每一棵树的位置由其所对应的坐标表示(任意两棵树的坐标都不相同)。
    在这个地区住着的猴子有M个,下雨时,它们都躲到了茂密高大的树冠中,没有被大水冲走。由于各个猴子的年龄不同、身体素质不同,它们跳跃的能力不同。有的猴子跳跃的距离比较远(当然也可以跳到较近的树上),而有些猴子跳跃的距离就比较近。这些猴子非常聪明,它们通过目测就可以准确地判断出自己能否跳到对面的树上。
    【问题】 现已知猴子的数量及每一个猴子的最大跳跃距离,还知道露出水面的每一棵树的坐标,你的任务是统计有多少个猴子可以在这个地区露出水面的所有树冠上觅食。

    Input

    第1行为一个整数,表示猴子的个数M(2<=M<=500);

    第2行为M个整数,依次表示猴子的最大跳跃距离(每个整数值在1--1000之间);

    第3行为一个整数表示树的总棵数N(2<=N<=1000);

    第4行至第N+3行为N棵树的坐标(横纵坐标均为整数,范围为:-1000--1000)。

    (同一行的整数间用空格分开)

    Output

    包括一个整数,表示可以在这个地区的所有树冠上觅食的猴子数

    Sample Input

    4
    1 2 3 4
    6
    0 0
    1 0
    1 2
    -1 -1
    -2 0
    2 2

    Sample Output

    3

    HINT

    对于40%的数据,保证有2<=N <=100,1<=M<=100


    对于全部的数据,保证有2<=N <= 1000,1<=M=500


    两点之间建边,求mst
    //
    //  main.cpp
    //  bzoj2429
    //
    //  Created by Candy on 9/9/16.
    //  Copyright © 2016 Candy. All rights reserved.
    //
    
    #include <iostream>
    #include <cstdio>
    #include <algorithm>
    #include <cstring>
    #include <queue>
    #include <cmath>
    using namespace std;
    const int N=1005,INF=1e9;
    inline int read(){
        int x=0,f=1;char ch=getchar();
        while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
        while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
        return x*f;
    }
    int n,m,a[N],ans=0;
    struct data{
        int x,y;
    }p[N];
    inline double dis(int i,int j){
        data a=p[i],b=p[j];
        return sqrt( (a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y) );
    }
    
    struct edge{
        int u,v;
        double w;
    }e[N*N];
    int cnt=0;
    inline void ins(int u,int v,double w){
        cnt++;
        e[cnt].v=v;e[cnt].w=w;e[cnt].u=u;
        cnt++;
        e[cnt].v=u;e[cnt].w=w;e[cnt].u=v;
        //printf("ins %d %d %f
    ",u,v,w);
    }
    bool cmp(edge a,edge b){
        return a.w<b.w;
    }
    void buildGraph(){
        for(int i=1;i<=n;i++)
            for(int j=i+1;j<=n;j++)
                ins(i,j,dis(i,j));
    }
    int fa[N];
    inline int find(int x){return fa[x]==x?x:fa[x]=find(fa[x]);}
    double kruskal(){
        double ans=0;
        for(int i=1;i<=n;i++) fa[i]=i;
        sort(e+1,e+1+cnt,cmp);
        for(int i=1;i<=cnt;i++){
            int u=e[i].u,v=e[i].v;
            int f1=find(u),f2=find(v);
            if(f1==f2) continue;
            ans=max(ans,e[i].w);fa[f1]=f2;
        }
        return ans;
    }
    int main(int argc, const char * argv[]) {
        m=read();
        for(int i=1;i<=m;i++) a[i]=read();
        n=read();
        for(int i=1;i<=n;i++) p[i].x=read(),p[i].y=read();
        buildGraph();
        double mn=kruskal();
        for(int i=1;i<=m;i++) if(a[i]>=mn) ans++;
        printf("%d",ans);
        return 0;
    }

    Source

  • 相关阅读:
    A2-02-15.DML-MySQL RIGHT JOIN
    A2-02-14.DML- MySQL LEFT JOIN
    A2-02-13.DML- MySQL INNER JOIN
    NHibernate N+1问题实例分析和优化
    怎么创建移动页面应用程序
    .NET开发时让人头痛的SESSION超时
    WCF服务编程——数据契约快速入门
    数据模型类对比,用反射做个快乐的程序员
    javascript常见数据集
    provider:命名管道提供程序,error:40
  • 原文地址:https://www.cnblogs.com/candy99/p/5856177.html
Copyright © 2020-2023  润新知