洛谷 P2504 [HAOI2006]聪明的猴子

题目描述

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

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

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

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

输入输出格式

输入格式:

输入文件monkey.in包括:

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

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

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

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

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

输出格式:

输出文件monkey.out包括一个整数,表示可以在这个地区的所有树冠上觅食的猴子数。

输入输出样例

输入样例#1: 复制

4
1 2 3 4
6
0 0
1 0
1 2
-1 -1
-2 0
2 2
输出样例#1: 复制

3

说明

【数据规模】

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

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

思路:求出每两棵树的间距,根据间距求最小生成树,最小生成树中权值最大的边即为猴子需要跳的最大距离,然后枚举猴子能跳的最远距离,与这个权值相比较即可

#include <algorithm>
#include <cstring>
#include <cstdio>
#include <cmath>
using namespace std;
const int M = ;
double sum;
int n, m, k;
int tot, ans;
int x[M], y[M];
int fa[M], far[M];
struct nond {
int u, v;
double w;
}e[M]; int find(int x) {
return fa[x] == x ? x : fa[x] = find(fa[x]);
} bool cmp(nond x, nond y) {
return x.w < y.w;
} int main() {
scanf("%d", &n);
for (int i = ; i <= n; i++)
scanf("%d", &far[i]);
scanf("%d", &m);
for (int i = ; i <= m; i++) {
fa[i] = i;
scanf("%d%d", &x[i], &y[i]);
}
for (int i = ; i <= m; i++)
for (int j = i + ; j <= m; j++) {
double tmp = sqrt((double)(x[i]-x[j])*(x[i]-x[j]) + (double)(y[i]-y[j])*(y[i]-y[j]));
e[++k].u = i; e[k].v = j; e[k].w = tmp;
}
sort(e + , e + k + , cmp);
for (int i = ; i <= k; i++) {
int x = find(e[i].u), y = find(e[i].v);
if (x == y) continue;
fa[x] = y;
tot++;
sum = max(e[i].w, sum);
if (tot == m - ) break;
}
for (int i = ; i <= n; i++)
if (far[i] >= sum) ans++;
printf("%d\n", ans);
return ;
}

最新文章

  1. MVC4 自定义错误页面(转)
  2. C# 自动部署之附加数据库
  3. Android 的图片异步请求加三级缓存 ACE
  4. android 完美退出所有Activity的demo
  5. Dancing Stars on Me---hdu5533(判断是否为正多边形)
  6. Sqli-labs less 17
  7. IE9下Ajax缓存问题
  8. Life in Changsha 第二次scrum冲刺
  9. MySQL数据库常用操作入门
  10. Elasticsearch笔记二之Curl工具基本操作
  11. Redis的java客户端jedis
  12. shell(2)图片重命名
  13. LDA背景资料
  14. centos 配置Openssl并创建证书
  15. Scrum:The Definition of Done —— 作业有没有写完呢?
  16. CentOS设置开机自动启动某服务
  17. oracle、Mysql数据库客户端DbVisualizer安装
  18. pymysql的使用心得(1)------小细节,注意!
  19. Go 语言官方包函数中文翻译
  20. jdbc连接hive0.14

热门文章

  1. POJ 1459 最大流 第二题
  2. UVA And Then There Was One
  3. Semi-Prime(半素数)
  4. javaScript 原型与原型链学习笔记
  5. Java的位运算符——&amp;0xFF的运算与讲解
  6. 【转】Flash AS3.0 中的自定义事件
  7. 【TC SRM 718 DIV 2 A】RelativeHeights
  8. CCF模拟题 最优灌溉
  9. Java 学习(13):抽象类&amp; 抽象方法&amp; 封装
  10. android中9-patch图片的使用