zoukankan      html  css  js  c++  java
  • 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 edge &e) const {
    return w < e.w;
    }
    } E[maxn * maxn];
     
    struct P {
    int x, y;
    inline void Read() {
    scanf("%d%d", &x, &y);
    }
    } A[maxn];
     
    double dist(int x, int y) {
    return sqrt(sqr(A[x].x - A[y].x) + sqr(A[x].y - A[y].y));
    }
     
    int d[maxn], N, M, cnt = 0, fa[maxn];
     
    int find(int x) {
    return x == fa[x] ? x : fa[x] = find(fa[x]);
    }
     
    int main() {
    scanf("%d", &M);
    for(int i = 0; i < M; i++) scanf("%d", d + i);
    scanf("%d", &N);
    for(int i = 0; i < N; i++) A[i].Read();
    for(int i = 0; i < N; i++)
       for(int j = i + 1; j < N; j++)
       E[cnt++] = (edge){i, j, dist(i, j)}; 
    sort(E, E + cnt);
    for(int i = 0; i < N; i++) fa[i] = i;
    double MIN = 0;
    for(int i = 0; i < cnt; i++) {
    edge* e = E + i;
    int u = find(e->u), v = find(e->v);
    if(u != v) {
    fa[u] = v;
    MIN = max(MIN, e->w);
    }
    }
    int ans = 0;
    for(int i = 0; i < M; i++) if(d[i] >= MIN) ans++;
    printf("%d ", ans);
    return 0;
    }

    --------------------------------------------------------------------------------

    2429: [HAOI2006]聪明的猴子

    Time Limit: 10 Sec  Memory Limit: 128 MB
    Submit: 547  Solved: 376
    [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


     


    Source

  • 相关阅读:
    hdu 5646 DZY Loves Partition
    bzoj 1001 狼抓兔子 平面图最小割
    poj 1815 Friendship 最小割 拆点 输出字典序
    spoj 1693 Coconuts 最小割 二者取其一式
    hdu 5643 King's Game 约瑟夫环变形
    约瑟夫环问题
    hdu 5642 King's Order
    CodeForces 631C Report
    1039: C语言程序设计教程(第三版)课后习题9.4
    1043: C语言程序设计教程(第三版)课后习题10.1
  • 原文地址:https://www.cnblogs.com/JSZX11556/p/4779663.html
Copyright © 2011-2022 走看看