题意:

在一个热带雨林中生存着一群猴子,它们以树上的果子为生。昨天下了一场大雨,现在雨过天晴,但整个雨林的地表还是被大水淹没着,部分植物的树冠露在水面上。猴子不会游泳,但跳跃能力比较强,它们仍然可以在露出水面的不同树冠上来回穿梭,以找到喜欢吃的果实。

现在,在这个地区露出水面的有N棵树,假设每棵树本身的直径都很小,可以忽略不计。我们在这块区域上建立直角坐标系,则每一棵树的位置由其所对应的坐标表示(任意两棵树的坐标都不相同)。

在这个地区住着的猴子有M个,下雨时,它们都躲到了茂密高大的树冠中,没有被大水冲走。由于各个猴子的年龄不同、身体素质不同,它们跳跃的能力不同。有的猴子跳跃的距离比较远(当然也可以跳到较近的树上),而有些猴子跳跃的距离就比较近。这些猴子非常聪明,它们通过目测就可以准确地判断出自己能否跳到对面的树上。

【问题】现已知猴子的数量及每一个猴子的最大跳跃距离,还知道露出水面的每一棵树的坐标,你的任务是统计有多少个猴子可以在这个地区露出水面的所有树冠上觅食。

分析

首先可以把所有树冠之间两两计算距离,时间复杂度(500000左右,足够)。然后跑一边Kruskal算出最小生成树,再在最小生成树中找到最大的一条边权,记录下来和每一只猴子的跳跃最值相比较就行了。

下面上代码

#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
int fa[1005],a[505],x[1005],y[1005];
int find(int x){return fa[x]==x?x:fa[x]=find(fa[x]);}//找父亲(写法一)
/*int find(int x)//找父亲(写法二)
{if(fa[x]!=x)fa[x]=find(fa[x]);return fa[x];
}*/
struct ben
{int s,t,e;
}ans[600005];//定义一个结构体,ans【i】表示一条从s出发到t权值为e的边
int cmp(const ben &a,const ben &b)//比较大小函数
{return a.e<b.e;
}
int op(int a,int b)//连边函数
{int x=find(a);int y=find(b);if(x!=y)fa[y]=x;return 0;
}
int main()
{int n,m;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",&x[i],&y[i]);fa[i]=i;//顺带着初始化fa数组,使每个人的父亲都先指向自己}int cnt=0;for(int i=1;i<=n;i++){for(int j=i+1;j<=n;j++){ans[++cnt].s=i;ans[cnt].t=j;ans[cnt].e=sqrt((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]));//计算平面直角坐标系中两点距离。}}sort(ans+1,ans+cnt+1,cmp);//从小到大排序,贪心思想int sum=0;int anss=0;for(int i=1;i<=cnt;i++){if(find(ans[i].s)!=find(ans[i].t))//判断是否已经有边{op(ans[i].s,ans[i].t);//连边anss=fmax(anss,ans[i].e);//不停取最大值,准备最后比较sum++;//记录连了几条边}if(sum==n-1)//最小生成树比然有节点个数-1条边break;}int answer=0;for(int i=1;i<=m;i++){if(a[i]>=anss)//每只猴子的跳跃极限只要超过了最小生成树中最长的一条边就一定能跳到所有节点{answer++;}}printf("%d",answer);return 0;
}

转载于:https://www.cnblogs.com/vercont/p/10210095.html

[HAOI2006]聪明的猴子 题解相关推荐

  1. P2504 [HAOI2006]聪明的猴子 题解

    P2504 [HAOI2006]聪明的猴子 题解 题目 链接 字面描述 题目描述 输入格式 输出格式 样例 #1 样例输入 #1 样例输出 #1 提示 思路 代码实现 题目 链接 https://ww ...

  2. BZOJ 2429: [HAOI2006]聪明的猴子【最小生成树】

    2429: [HAOI2006]聪明的猴子 Time Limit: 10 Sec Memory Limit: 128 MB Description 在一个热带雨林中生存着一群猴子,它们以树上的果子为生 ...

  3. bzoj 2429: [HAOI2006]聪明的猴子(最小生成树)

    2429: [HAOI2006]聪明的猴子 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 1570  Solved: 902 [Submit][St ...

  4. 洛谷p2504 HAOI2006 聪明的猴子

    [题目描述] 在一个热带雨林中生存着一群猴子,它们以树上的果子为生.昨天下了一场大雨,现在雨过天晴,但整个雨林的地表还是被大水淹没着, 猴子不会游泳,但跳跃能力比较强,它们仍然可以在露出水面的部分植物 ...

  5. [BZOJ2429][HAOI2006]聪明的猴子(最小生成树)

    性质:最小生成树上任意两点间的最大边权,一定是这两点间所有路径的最大边权中最小的.证明显然. 1 #include<cstdio> 2 #include<cstring> 3 ...

  6. 语法入门*算法入门题单

    作者:王清楚 链接:https://ac.nowcoder.com/discuss/817596?type=101&order=0&pos=1&page=4&chann ...

  7. 【新手上路】语法入门算法入门题单

    作者:王清楚 链接:[新手上路]语法入门&算法入门题单_ACM竞赛_ACM/CSP/ICPC/CCPC/比赛经验/题解/资讯_牛客竞赛OJ_牛客网 来源:牛客网 介绍:本题单分为语法入门和算法 ...

  8. BZOJ刷题记录---提高组难度

    BZOJ刷题记录---提高组难度 总目录详见https://blog.csdn.net/mrcrack/article/details/90228694 序号 题号 算法 思想难度 实现难度 总难度 ...

  9. 2019.4.summary

    2019.4.1 BZOJ1061: [Noi2008]志愿者招募 真心有点难QAQ https://www.byvoid.com/zhs/blog/noi-2008-employee 看void爷的 ...

  10. 最小生成树 解释 + 板子题

    学习链接:https://oi-wiki.org/graph/concept/ 带有步骤:最小生成树 - 哎呦哎(iui) - 博客园 概念: 边权和最小的生成树 (v:点   g:边  | 只有连通 ...

最新文章

  1. js ajax调用请求
  2. android 百分号,关于Android资源文件中出现百分号的问题
  3. url的三个js编码函数escape(),encodeURI(),encodeURIComponent()简介【转】
  4. centos下rmp包离线下载
  5. CSS3--幽灵按钮特效(实例)
  6. 视频容器格式与编码格式简介
  7. bp神经网络隐含层神经元个数_CNN,残差网络,BP网络
  8. 高效排错系列--摘要
  9. 查看linux环境下cudnn是否安装,Linux下安装cuda和对应版本的cudnn
  10. 官网下载mysql源码
  11. 基于三菱FX系列与扫码枪232的通讯
  12. opencv python 常用方法
  13. idea常用的搜索方式
  14. JAVA j2se面试题
  15. AWS​捅大篓子了,近1G敏感数据Github裸奔5小时
  16. 园林景观cad_5+ 园林景观设计PSD树木建筑人物鸟瞰图效果图ps后期分层素材库配景A...
  17. 男生晚上做什么兼职好?有什么好兼职推荐吗?
  18. Java实现文件拷贝,以及修改文件扩展名
  19. vivo Hi-Fi+QQ音乐 数字音乐市场的一剂良方
  20. 通过QQ号查询对方QQ绑定手机号

热门文章

  1. android 底层键值映射,如何在使用android-ETE时进行键值映射.doc
  2. android linux 双系统实现(android+buster)同时运行
  3. 力扣994:腐烂的橘子(BFS)
  4. 怎么把计算机隐藏文件显示出来,怎么把隐藏的文件夹显示出来
  5. 计算机替换的快捷键,Autointo Hotkey Changer电脑快捷键替换工具
  6. 错误: 找不到或无法加载主类 org.sang.BlogserverApplication
  7. Android批量打包
  8. Win32 绘制RGB三原色图案
  9. acm快速输入法 有效解决超时
  10. 小柯在学JAVA之第二弹