本题主要用到了生成树算法,主要思路就是求出树之间的最大距离,进而判断每个猴子是否符合条件。
直接上代码了
#include <iostream>
#include <cmath>
#include <algorithm>
using namespace std;
const int N = 1e6 + 5;
int a[1005][3], b[1005], c[1005],q,ans;
double k=-1;
struct ss
{
int x, y;
double p;
}s[N];
int cmp(ss k,ss d)
{
return k.p < d.p;
}
int find(int x)
{
if (c[x] != x)
c[x] = find(c[x]);
return c[x];
}
double suan(int x1, int x2, int x3, int x4);
int main()
{
int n, m;
cin >> n;
for (int i = 1; i <= n; i++)
cin >> b[i];
cin >> m;
for (int i = 1; i <= m; i++)
cin >> a[i][1] >> a[i][2];
for(int i=1;i<=m;i++)//以下为Kruskal算法
for (int j = 1; j <= m; j++)
{
if (j == i)
continue;
q++;
s[q].x = i;
s[q].y = j;
s[q].p = suan(a[i][1], a[j][1], a[i][2], a[j][2]);
}
int sum = m;
sort(s + 1, s + q + 1, cmp);
for (int i = 1; i <= m; i++)
{
c[i] = i;
}
for (int i = 1; i <= q; i++)
{
if (sum == 1)
break;
int s1 = find(s[i].x), s2 = find(s[i].y);
if (s1 != s2)
{
c[s1] = s2;
sum--;
k = s[i].p;
}
}
for (int i = 1; i <= n; i++)
{
if (b[i] >= k)
ans++;
}
cout << ans;
}
double suan(int x1, int x2, int x3, int x4)//求两点间距离
{
return sqrt((x1 - x2) * (x1 - x2) + (x3 - x4) * (x3 - x4));
}