cogs 1310. [HAOI2006]聪明的猴子

1310. [HAOI2006]聪明的猴子

★   输入文件:monkey.in   输出文件:monkey.out   简单对比
时间限制:1 s   内存限制:128 MB
【题目描述】

在一个热带雨林中生存着一群猴子,它们以树上的果子为生。昨天下了一场大雨,现在雨过天晴,但整个雨林的地表还是被大水淹没着,

猴子不会游泳,但跳跃能力比较强,它们仍然可以在露出水面的部分植物的树冠上来回穿梭,以找到喜欢吃的果实。

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

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

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

【输入格式】

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

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

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

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

【输出格式】

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

【样例输入】

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

【样例输出】

3

【提示】

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

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

思路:最小生成树。

#include<cmath>
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
int monky[501];
struct q{
    int x,y,t;
}tree[1001];
int m,n,num,f[1001];
struct p{
    int from;
    int to;
    double dis;
}c[1000001];
int cmp(p a1,p a2){
    return a1.dis<a2.dis;
}
int find(int x){
    if(f[x]!=x) f[x]=find(f[x]);
    return f[x];
}
int main(){
    freopen("monkey.in","r",stdin);
    freopen("monkey.out","w",stdout);
    cin>>m;
    for(int i=1;i<=m;i++)
        cin>>monky[i];
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>tree[i].x>>tree[i].y;
        tree[i].t=i;
    }
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++){
            c[++num].from=tree[i].t;
            c[num].to=tree[j].t;
            c[num].dis=sqrt(pow(tree[i].x-tree[j].x,2)+pow(tree[i].y-tree[j].y,2));
        }
    stable_sort(c+1,c+1+num,cmp);
    stable_sort(monky+1,monky+1+m);
    int u,l=0;
    for(int i=1;i<=n;i++)    f[i]=i;
    for(int i=1;i<=num;i++){
        if(l==n-1) break;
        if(find(c[i].from)!=find(c[i].to)){
            f[find(c[i].from)]=find(c[i].to);
            l++;
            u=c[i].dis;
        }
    }
    int tot=0;
    for(int i=1;i<=m;i++)
        if(monky[i]>=u)
            tot++;
    cout<<tot;
    return 0;
}
时间: 2024-12-07 21:39:42

cogs 1310. [HAOI2006]聪明的猴子的相关文章

COGS——T1310. [HAOI2006]聪明的猴子

http://cogs.pro/cogs/problem/problem.php?pid=1310 ★   输入文件:monkey.in   输出文件:monkey.out   简单对比时间限制:1 s   内存限制:128 MB [题目描述] 在一个热带雨林中生存着一群猴子,它们以树上的果子为生.昨天下了一场大雨,现在雨过天晴,但整个雨林的地表还是被大水淹没着, 猴子不会游泳,但跳跃能力比较强,它们仍然可以在露出水面的部分植物的树冠上来回穿梭,以找到喜欢吃的果实. 现在,在这个地区露出水面的有

BZOJ 2429: [HAOI2006]聪明的猴子( MST )

水题, 求MST即可. -------------------------------------------------------------------------------- #include<bits/stdc++.h> using namespace std; #define sqr(x) ((x) * (x)) const int maxn = 1009; struct edge { int u, v; double w; bool operator < (const e

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

2429: [HAOI2006]聪明的猴子 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 896  Solved: 575[Submit][Status][Discuss] Description 在一个热带雨林中生存着一群猴子,它们以树上的果子为生.昨天下了一场大雨,现在雨过天晴,但整个雨林的地表还是被大水淹没着,部分植物的树冠露在水面上.猴子不会游泳,但跳跃能力比较强,它们仍然可以在露出水面的不同树冠上来回穿梭,以找到喜欢吃的果实. 现在,在

2429: [HAOI2006]聪明的猴子

2429: [HAOI2006]聪明的猴子 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 448  Solved: 309[Submit][Status][Discuss] Description 在一个热带雨林中生存着一群猴子,它们以树上的果子为生.昨天下了一场大雨,现在雨过天晴,但整个雨林的地表还是被大水淹没着,部分植物的树冠露在水面上.猴子不会游泳,但跳跃能力比较强,它们仍然可以在露出水面的不同树冠上来回穿梭,以找到喜欢吃的果实. 现在,在

BZOJ 2429: [HAOI2006]聪明的猴子

Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1502  Solved: 855[Submit][Status][Discuss] Description 在一个热带雨林中生存着一群猴子,它们以树上的果子为生.昨天下了一场大雨,现在雨过天晴,但整个雨林的地 表还是被大水淹没着,部分植物的树冠露在水面上.猴子不会游泳,但跳跃能力比较强,它们仍然可以在露出水面 的不同树冠上来回穿梭,以找到喜欢吃的果实.现在,在这个地区露出水面的有N棵树,假设每棵树本

bzoj2429[HAOI2006]聪明的猴子

题意: 平面上N个点(任意两个点的坐标都不相同).现已知M个猴子的最大跳跃距离,还知道N个点坐标,统计有多少个猴子可以在所有点上觅食. 题解: 题目中隐含了一个条件,就是猴子可以从任意点出发.因此我们可以确定一个点,求出它到所有点的最小距离的最大值,然后判断每只猴子的跳跃距离是否大于等于这个最大值.这正是MST问题,用Kruscal排序后选的第n-1条边的长度就是根到所有点的最小距离的最大值. 代码: 1 #include <cstdio> 2 #include <algorithm&g

[HAOI2006]聪明的猴子

/* 找出能连通所有点的一棵树 是的最大的边最小 很显然就是最小生成树. 堆优化prim. */ #include<iostream> #include<cstring> #include<cstdio> #include<cmath> #include<queue> #define maxn 1010 #define inf 999999999 using namespace std; int n,m,num,head[maxn],ans,to

[HAOI2006] 聪明的猴子 - Kruskal

求给定的一组数中,不小于点集生成树中最长边距的有多少个. Solution 裸题. #include <bits/stdc++.h> using namespace std; #define int long long const int N = 2005; struct edge { int u,v; double w; bool operator < (const edge &b) { return w<b.w; } } e[N*N]; int n,m,x[N],y[N

利用Kruskal算法求最小生成树解决聪明的猴子问题 -- 数据结构

题目:聪明的猴子 链接:https://ac.nowcoder.com/acm/problem/19964 在一个热带雨林中生存着一群猴子,它们以树上的果子为生.昨天下了一场大雨,现在雨过天晴,但整个雨林的地 表还是被大水淹没着,部分植物的树冠露在水面上.猴子不会游泳,但跳跃能力比较强,它们仍然可以在露出水面 的不同树冠上来回穿梭,以找到喜欢吃的果实.现在,在这个地区露出水面的有N棵树,假设每棵树本身的直径都 很小,可以忽略不计.我们在这块区域上建立直角坐标系,则每一棵树的位置由其所对应的坐标表