湖大CG满分教程:矿工挖矿

问题描述】一个矿工在指定地点挖矿,采矿的工具最长可达 k 。设有 n 个矿点,编号从 1 到 n ,其中第 i 个矿点的位置可以表示为一个平面整数坐标。

请根据矿工所在位置 (X,Y)找出所有可以采集的矿点,并找到其中最近和最远的矿点的编号,若不存在则均输出 -1。

【输入形式】输入共 n+1行。

第一行包含用空格分隔的四个整数 n 、X 、 Y 和 k ,分别表示矿点总数、矿工所在位置和采矿工具的最长可达距离。

第二行到第 n+1 行依次输入 n 个矿点的坐标。第 i+1 行(1<=i<=n)包含用空格分隔的两个整数 xi 和 yi,表示 i 号矿点所在位置。

【输出形式】输出共两行。

第一行输出一串编号,按编号从小到大,依次输出可以采集到的矿点编号,每个编号之间用空格分隔。若不存在则输出-1;

第二行输出可采集的最近、最远矿点的编号,当距离相同时,编号小的视为更近。用空格分隔。若不存在则均输出-1。

【样例输入1】

3 2 2 1

2 3

3 3

2 4

【样例输出1】

1

1 1

【样例说明】只有第 1 个矿点可以采集到

【样例输入2】

3 2 2 1

2 4

2 5

3 4

【样例输出2】

-1

-1 -1

【样例说明】没有可以采集到的矿点

【样例输入3】

3 2 2 3

2 4

2 0

3 5

【样例输出3】

1 2

1 2

【样例说明】1,2号矿点可以采集到,且距离相同,则1号视为更近,2号视为更远

【评分标准】

  评测用例规模与约定

  所有评测用例满足:1 ≤ n ≤ 100。

#include<bits/stdc++.h>
using namespace std;
struct kuang
{
    int x,y,d,num;
};
kuang neng[100];
bool cmp2(kuang a,kuang b)
{
    if(a.d!=b.d)
    {
        return a.d<b.d;
    }
    else
    {
        return a.num<b.num;
    }
} 
bool cmp1(kuang a,kuang b)
{
    return a.num<b.num;
}
int main()
{
    int n,X,Y,k;
    cin>>n>>X>>Y>>k;
    kuang kg[n];
    int tool=k*k;
    int sum=0;
    for(int i=0;i<n;i++)
    {
        cin>>kg[i].x>>kg[i].y;
        kg[i].num=i+1;
        kg[i].d=(kg[i].x-X)*(kg[i].x-X)+(kg[i].y-Y)*(kg[i].y-Y);
        if(tool>=kg[i].d)
        {
            neng[i].x=kg[i].x;
            neng[i].y=kg[i].y;
            neng[i].num=kg[i].num;
            sum++;
        }
    }
    if(sum==0)
    {
        cout<<"-1"<<endl<<"-1"<<" "<<"-1";
    }
    else
    {
        sort(neng,neng+sum,cmp1);
        for(int i=0;i<sum;i++)
        {
            cout<<neng[i].num <<" ";
        }
        cout<<endl;
        sort(neng,neng+sum,cmp2);
        cout<<neng[0].num<<" "<<neng[sum-1].num ;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值