[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,tot;
bool f[maxn];
double x[maxn],y[maxn],v[maxn],dis[maxn],maxx;
struct edge
{
    int u,v,pre;
    double t;
}e[maxn*maxn];
struct node
{
    int ki,si;
    node (int kk,int ss):ki(kk),si(ss) {};
    bool operator < (const node & a) const
      {
        return si>a.si;
      }
};
priority_queue<node>q;
double Get_dis(int a,int b,int c,int d)
{
    return sqrt((a-c)*(a-c)+(b-d)*(b-d));
}
double min(double a,double b)
{
    return a>b?a:b;
}
void Add(int from,int to,double dis)
{
    num++;e[num].u=from;e[num].v=to;e[num].t=dis;
    e[num].pre=head[from];head[from]=num;
}
void Prim()
{
    for(int i=0;i<=n;i++)dis[i]=inf;
    q.push(node(1,0));dis[1]=0;
    while(!q.empty()&&tot<n)
      {
        int k=q.top().ki;q.pop();
        if(f[k])continue;f[k]=1;
        maxx=max(maxx,dis[k]);tot++;
        for(int i=head[k];i;i=e[i].pre)
          {
            int v=e[i].v;
            if(dis[v]>e[i].t)
              {
                dis[v]=e[i].t;
                q.push(node(v,dis[v]));
              }
          }
      }
}
int main()
{
    scanf("%d",&m);
    for(int i=1;i<=m;i++)
      scanf("%lf",&v[i]);
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
      scanf("%lf%lf",&x[i],&y[i]);
    for(int i=1;i<=n;i++)
      for(int j=1;j<=n;j++)
        {
          if(i==j)continue;
          double tmp=double(Get_dis(x[i],y[i],x[j],y[j]));
          Add(i,j,tmp);
        }
    Prim();
    for(int i=1;i<=m;i++)
      if(v[i]>=maxx)
        ans++;
    printf("%d\n",ans);
    return 0;
}
时间: 2024-10-24 20:32:07

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

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

cogs 1310. [HAOI2006]聪明的猴子

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

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

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

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] 聪明的猴子 - 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棵树,假设每棵树本身的直径都 很小,可以忽略不计.我们在这块区域上建立直角坐标系,则每一棵树的位置由其所对应的坐标表