2017年8月14日提高组T1 跳跃

本文介绍了一个关于平面直角坐标系中的人们能否从任一点出发到达所有其他点的问题。通过构建最小生成树的方法,计算每个人的最大可行距离,并判断其是否能覆盖所有点。文章提供了一段C++实现代码作为示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Description

在平面直角坐标系内有n个点。现在有m个人,每个人都有一个行走距离d,也就是说这个人只能走到与它当前位置距离不大于d的点。问有多少个人可以从任意一个点开始,并能够到达所有点。

Input

第一行为一个整数m,表示人的个数。
第二行为m个整数d,表示每个人的行走距离。
第三行为一个数n,表示点的数量。
接下来n行每行包含两个整数x,y,表示平面内一个点的坐标。

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
对于100%的数据,2<=n<=1000,1<=m<=500,1<=d<=1000,-1000<=x,y<=1000
做法:最小生成树。。模板。。
代码如下:

#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <queue>
#define maxn 2000007
using namespace std;
struct arr
{
    int x,y;
    double w;
}g[maxn];
int a[20007],q[20007],p[20007],n,m,f[20007],e,ans=0;
double mid=0.0;

int find(int x)
{
    if (!f[x])  return x;
    f[x]=find(f[x]);
    return f[x];
}

double compare(arr a,arr b)
{
    return a.w<b.w;
}

double pow2(double x,double y)
{
    return x*x;
}

int main()
{
    //freopen("jump.in","r",stdin);
    //freopen("jump.out","w",stdout);
    scanf("%d",&n);
    for (int i=1;i<=n;i++)
        scanf("%d",&a[i]);
    scanf("%d",&m);
    for (int i=1;i<=m;i++)
        scanf("%d%d",&q[i],&p[i]);
    for (int i=1;i<m;i++)
        for (int j=i+1;j<=m;j++)
        {
            e++;
            g[e].x=i;
            g[e].y=j;
            g[e].w=sqrt(pow2(q[i]-q[j],2)+pow2(p[i]-p[j],2));
        }
    sort(g+1,g+e+1,compare);
    for (int i=1;i<=e;i++)
        if (find(g[i].x)!=find(g[i].y))
        {
            f[find(g[i].x)]=find(g[i].y);
            mid=g[i].w;
        }       
    for (int i=1;i<=n;i++)
        if (a[i]>=mid)  ans++;
    cout<<ans;
    fclose(stdin);
    fclose(stdout);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值