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\n",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

Day2

时间: 2024-10-13 18:59:32

BZOJ2429[HAOI2006]聪明的猴子[最小生成树 kruskal]的相关文章

bzoj2429[HAOI2006]聪明的猴子

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

2429: [HAOI2006]聪明的猴子

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

cogs 1310. [HAOI2006]聪明的猴子

1310. [HAOI2006]聪明的猴子 ★   输入文件:monkey.in   输出文件:monkey.out   简单对比时间限制:1 s   内存限制:128 MB [题目描述] 在一个热带雨林中生存着一群猴子,它们以树上的果子为生.昨天下了一场大雨,现在雨过天晴,但整个雨林的地表还是被大水淹没着, 猴子不会游泳,但跳跃能力比较强,它们仍然可以在露出水面的部分植物的树冠上来回穿梭,以找到喜欢吃的果实. 现在,在这个地区露出水面的有N棵树,假设每棵树本身的直径都很小,可以忽略不计.我们在

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

[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

BZOJ 2429: [HAOI2006]聪明的猴子

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

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

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

[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

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

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