第1行为一个整数,表示猴子的个数M(2<=M<=500);
第2行为M个整数,依次表示猴子的最大跳跃距离(每个整数值在1--1000之间);
第3行为一个整数表示树的总棵数N(2<=N<=1000);
第4行至第N+3行为N棵树的坐标(横纵坐标均为整数,范围为:-1000--1000)。
(同一行的整数间用空格分开)
包括一个整数,表示可以在这个地区的所有树冠上觅食的猴子数
3
解题思路:一眼就看出来的最小瓶颈生成树。
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<cmath>
using namespace std;
struct ss
{
int x1,y1;
double ju;
}q[1010000];
int f[1001],v[1001],x[1001],y[1001];
int m,n,len;
inline int read()
{
char y; int x=0,f=1; y=getchar();
while (y<'0' || y>'9') {if (y=='-') f=-1; y=getchar();}
while (y>='0' && y<='9') {x=x*10+int(y)-48; y=getchar();}
return x*f;
}
double pow(int x1,int y1,int x2,int y2)
{
return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
}
bool cmp(ss xx,ss yy)
{
return xx.ju<yy.ju;
}
int find(int o)
{
if (f[o]!=o)f[o]=find(f[o]);
return f[o];
}
int main()
{
m=read(); len=0;
for (int i=1;i<=m;++i)
{
v[i]=read();
}
n=read();
for (int i=1;i<=n;++i)
{
x[i]=read(); y[i]=read(); f[i]=i;
}
for (int i=1;i<=n-1;++i)
for (int j=i+1;j<=n;++j)
if (i!=j)
{
++len;
q[len].x1=i; q[len].y1=j; q[len].ju=pow(x[i],y[i],x[j],y[j]);
}
double ans=-1;
sort(q+1,q+len+1,cmp);
for (int i=1;i<=len;++i)
{
int u1=find(q[i].x1); int u2=find(q[i].y1);
if (u1!=u2)
{
f[u1]=u2;
ans=max(ans,q[i].ju);
}
}
int sum=0;
for (int i=1;i<=m;++i)
if (v[i]>=ans)
++sum;
printf("%d",sum);
}