CCF计算机软件能力认证试题练习:202009-1 称检测点查询

CCF计算机软件能力认证试题练习:202009-1 称检测点查询

  • 试题描述
    2020 年 6 月 8 日,国务院联防联控机制发布《关于加快推进新冠病毒核酸检测的实施意见》,提出对“密切接触者”等八类重点人群“应检尽检”,其他人群“愿检尽检”。
    某市设有n个核酸检测点,编号从1到n,其中i号检测点的位置可以表示为一个平面整数坐标(xi, yi)。
    为方便预约核酸检测,请根据市民所在位置(X, Y),查询距其最近的三个检测点。
    多个检测点距离相同时,编号较小的视为更近。
  • 输入
    输入共n+1行
    第一行包含用空格分隔的三个整数n、X和Y,表示检测点总数和市民所在位置。
    第二行到第n+1行依次输入n个检测点的坐标。第i+1行(1≤i≤n)包含用空格分隔的两个整数xi和yi,表示i号检测点所在位置。
  • 输出
    输出共三行,按距离从近到远,依次输出距离该市民最近的三个检测点编号。
  • 输入样例
    5 0 1
    -1 0
    0 0
    1 0
    0 2
    -1 2
  • 输出
    2
    4
    1
  • 算法思路
    这道题目的思路很简单,如果用暴力,最简单粗暴的方法就是,定义结构体数组,用for循环对检测点到检测者的距离排序,但是会遇到一个问题就是当距离相等时按编号升序,如果在输出的时候判断这种情况再排序就把问题复杂化了,既然涉及到结构体、按关键字排序,那么第一时间就应该想到优先队列,在网上找了很久优先队列的介绍但是很少,基本都是代码片,以下是我个人的理解。
  1. 优先队列举例

下面展示一些 优先队列的实现

#include<cstdio>
#include<queue>
using namespace std;
struct node
{
	int x,y;
}k;
 
 
struct cmp1    //另辟struct,排序自定义
{
	bool operator () (const node & a,const node & b) const
	{//以X为准从小到大,若X相等则比较Y,Y值大的在前 
	    if(b.x!=a.x) return b.x<a.x;
        else  return b.y>a.y;
	}
};
priority_queue <node,vector<node>,cmp1> q;  //优先列队写法
int main()
{
	k.x=10,k.y=100; q.push(k);
	k.x=14,k.y=60; q.push(k);
	k.x=14,k.y=80; q.push(k);
	k.x=6,k.y=80; q.push(k);
	k.x=8,k.y=20; q.push(k);
	while(!q.empty())
	{
		node m=q.top(); q.pop();
		printf("(%d,%d) ",m.x,m.y);
	}
}

上面的例子是我学习优先队列时在一个博客看到的,如果侵权请私信我。
我们可以看到,它定义了一个结构体,自定义了比较器(准确术语我也不知),bool operator () (const node & a,const node & b) 参数是node类型的a,b,在if语句中又比较的是b.x和a.x,我个人一个比较笨的理解方法就是,在队列中a排在b前,b.x等于a.x,说明第一关键字相等,判断第二关键字,比较办法相同。如果b.x小于a.x返回的正数1,那么就要交换a和b,如果b.x大于a.x,无操作。感觉我说的很乱,就理解成一个排序算法就行了。

  1. 算法实现
    有了对优先队列的了解来看这道题,就会很简单,我们只需要计算距离,完成数据输入输出即可
#include<cstdio>
#include <iostream>
#include<queue>
using namespace std;

int a,b;

struct node
{
	int x,y,d,id;
}k;
 
 
struct cmp1    //另辟struct,排序自定义
{
	bool operator () (const node & a,const node & b) const
	{//以X为准从小到大,若X相等则比较Y,Y值大的在前 
	    if(b.d!=a.d) return b.d<a.d;
        else  return b.id<a.id;
	}
};

int distance(){
	int r = (k.x-a)*(k.x-a)+(k.y-b)*(k.y-b);
	return r;
}

priority_queue <node,vector<node>,cmp1> q;  //优先列队写法

int main()
{
	int i,n;
	cin>>n>>a>>b;
	for(i=1; i<=n; i++){
		cin>>k.x;
		cin>>k.y; 
		k.id = i;
		k.d = distance();
		q.push(k);
	}
	i=3;
	while(!q.empty() && i--)
	{
		node m = q.top(); 
		q.pop();
		//cout<<"id="<<m.id<<","<<m.d<<endl;
		//printf("%d %d\n",m.x,m.y);
		cout<<m.id<<endl;
	}
}

此篇博客为了我以后复习看,如果给您带来困扰请谅解。欢迎一起探讨。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值