记录编号 535120 评测结果 AAAAAAAAAA
题目名称 [HAOI 2006]聪明的猴子 最终得分 100
用户昵称 GravatarRichard 是否通过 通过
代码语言 C++ 运行时间 0.782 s
提交时间 2019-07-04 09:52:56 内存使用 25.12 MiB
显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
#define MAXN 1000001
struct P
{
    int x,y,z;
}a[MAXN];//结构体
int fa[1005],n,m,p=0,ans=0,x[1005],y[1005],num=0;
int j[1005];//j->每只猴子jump的范围
int fx,fy;
int find(int x)//找爸爸
{
    if(fa[x]==x) return x;
    else return fa[x]=find(fa[x]);
}
bool cmp(P q,P w)
{
    return q.z<w.z;
}
int main()
{
    freopen("monkey.in","r",stdin);
	freopen("monkey.out","w",stdout);
	cin>>n;
    for(int i=1;i<=n;i++)
        cin>>j[i];
    cin>>m;
    for(int i=1;i<=m;i++)
    {
        fa[i]=i;
        cin>>x[i]>>y[i];
        fx=x[i],fy=y[i];
        for(int j=1;j<i;j++)
        {
            p++;//记录边的总数
            int fxx=fx-x[j],fyy=fy-y[j];
            int s=fxx*fxx+fyy*fyy;
            a[p].x=i;
            a[p].y=j;
            a[p].z=s;
        }
    }
    sort(a+1,a+p+1,cmp);
    for(int i=1;i<=p;i++)
    {
        fx=find(a[i].x),
        fy=find(a[i].y);
        if(fx==fy) continue;
        fa[fx]=fy;
        ans=a[i].z;//因为已经排序过了,就不用max了,最后取到的就是最大的
    }
    double q=sqrt(ans);
    for(int i=1;i<=n;i++)
    {
        if(q<=j[i]) num++;
    }
    cout<<num;
    return 0;
}
//对数据结构的说明,x y数组用来存坐标 p为边数
//num为猴子的数量累加器 ans为遍历全程中最大的距离是 从而与每个猴子的最大跳跃距离比较