题解 | #[HAOI2006]聪明的猴子#

[HAOI2006]聪明的猴子

https://ac.nowcoder.com/acm/problem/19964

题意

求出 满足条件的猴子的数目,满足的条件是:能在这个地区的所有树冠上觅食
换成用数学语言来描述条件 :猴子的最大跳跃距离 MaxD 需大于或等于 最小生成树 边集 中最长的那条边

最小生成树:联通该地区所有的树冠 所形成的最小生成树

思路

prim 算法扫一遍,在这个过程中,求出 最小生成树 边集中 的最大边长 ,统计 最大跳跃距离 大于或等于其的 猴子的数目

注意: double 类项 不能用memset 初始化 ( wa了好久 最后发现的 )

综上,Code 如下 .

Code

#include <bits/stdc++.h>

using namespace std;

const int N=1010;

struct node{
    int x,y;
}p[N];  
bool st[N];
double a[N],g[N][N],dist[N]; 
int n,m;

int pf(int x){
    return x*x;
}

double prim(){
    double res=-1;

    for(int j=1;j<=n;j++)  dist[j]=1e8; // double 不能用memset 
    for(int i=0;i<n;i++){
        int t=-1;
        for(int j=1;j<=n;j++) if(!st[j]&&(t==-1||dist[t]>dist[j])) t=j;
        st[t]=true;
        if(i) res=max(dist[t],res);  // 求最长边
        for(int j=1;j<=n;j++) dist[j]=min(dist[j],g[t][j]);
    }
    return res;
}

int main(){
    cin>>m;
    for(int i=1;i<=m;i++) cin>>a[i];

    cin>>n;
    for(int i=1;i<=n;i++) cin>>p[i].x>>p[i].y;

    for(int i=1;i<=n;i++) for(int j=1;j<=n;j++){
        int x=p[i].x,y=p[i].y,x1=p[j].x,y1=p[j].y;
        g[j][i]=g[i][j]=sqrt(pf(x-x1)+pf(y-y1));    
    }

    double t=prim();
    int res=0;
    for(int i=1;i<=m;i++) if(a[i]>=t) res++;    
    cout<<res<<endl;

    return 0;
}
全部评论

相关推荐

机械打工仔:不管啥专业,找工作改简历的第一课先把你那排版改了,简历上不要写个人简历四个字,找你要简历的谁不知道这个是简历?而且还占那么多空间,直接把自己名字和基础信息写上面,整体字体大一些。 还有这种经典两页简历一页大空白,导出PDF的时候多了一页几乎全是白的你自己看着不难受吗随手的事为啥不能改掉呢,这是态度问题,你试想一下你是HR你打开简历看到格式都没调整过会是什么感受?你自己都不重视你的简历,HR更不会在意。 然后内容你那个做两年咖啡就别往里写了,简历在精不在多,你在往你的简历里打字的时候就要想好这东西对你要找的工作有没有帮助。自我评价写一行就行了,不如给专业技能单开一栏。核心课程均分90这个真别写了,把你上过的有用的专业课列出来也行。有很多地方废话很多的精炼一下,比如你校内项目第一个写的那些,全然没有重点。 好好修改一下,我看你内容也挺优秀的,别被一个随便做的简历耽误了,我一个同专业的打工人看了都揪心更别说一天看几百份简历的HR
听劝,我这个简历该怎么改...
点赞 评论 收藏
分享
评论
2
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务