当前位置: 代码迷 >> 综合 >> csp 202009-1检测点查询 Java和c++(100)
  详细解决方案

csp 202009-1检测点查询 Java和c++(100)

热度:97   发布时间:2023-12-13 18:18:28.0

题目背景
2020 年 6 月 8 日,国务院联防联控机制发布《关于加快推进新冠病毒核酸检测的实施意见》,提出对“密切接触者”等八类重点人群“应检尽检”,其他人群“愿检尽检”。

问题描述
某市设有n 个核酸检测点,编号从 1 到 n,其中i 号检测点的位置可以表示为一个平面整数坐标 (xi,yi)。

为方便预约核酸检测,请根据市民所在位置 ,查询距其最近的三个检测点。
多个检测点距离相同时,编号较小的视为更近。

输入格式
输入共 n行。

第一行包含用空格分隔的三个整数 n、x 和 y,表示检测点总数和市民所在位置。

第二行到第 n+1 行依次输入n 个检测点的坐标。第i 行包含用空格分隔的两个整数 x和 y表示 i号检测点所在位置。

输出格式
输出共三行,按距离从近到远,依次输出距离该市民最近的三个检测点编号。

样例输入1
3 2 2
2 2
2 3
2 4
Data
样例输出1
1
2
3
Data
样例输入2
5 0 1
-1 0
0 0
1 0
0 2
-1 2
Data
样例输出2
2
4
1

java程序:

///java程序
//package CSP;
import java.util.*;
class Num implements Comparable{
    public int number;public int val;public int x;public int y;Num(int number,int val){
    this.number = number;this.val = val;//this.x = x;// this.y = y;}public int compareTo(Object o) {
    //这是一个判断器,对于一个对象oNum num = (Num)o;//进行比较的这个对象o是Num类new的对象if(this.val!=num.val)//含义大概就是数组里的数两两比较return this.val-num.val;//如果值不一样就挑值小的排前面elsereturn this.number-num.number;//如果值一样就序号小的放前面}//跟c++的sort+结构体+自写cmp挺类似,但有区别,sort里的cmp返回的是个bool型,用大于小于号//但是这里的判断器返回的是int型,用减号
}
public class Q202009_1 {
    //注意这里提交的时候要改成Mainpublic static void main(String[] args) {
    int n;int x,y;Scanner sc = new Scanner(System.in);n = sc.nextInt();x = sc.nextInt();y = sc.nextInt();Num dis[] = new Num[n];for(int i=0;i<n;i++) {
    int x_get = sc.nextInt();int y_get = sc.nextInt();int distance = (x-x_get)*(x-x_get)+(y-y_get)*(y-y_get);dis[i] = new Num(i,distance);// System.out.print();}Arrays.parallelSort(dis);for(int i=0;i<3;i++) {
    System.out.println(dis[i].number+1);}//排序}
}

其实我不太理解这种方法。我也是看了别人的办法写的。

c++:
组合拳,结构体+stl库+自写cmp函数

#include<iostream>
#include<algorithm> 
#include<math.h>
using namespace std;//这句千万不要忘记写
struct Node{
    int number;//第几个int val;//距离
};
bool cmp(Node a,Node b){
    if(a.val == b.val)return a.number<b.number;elsereturn a.val<b.val;
}
int main(){
    //int x,y;int n,x,y;cin>>n>>x>>y; Node dis[n];for(int i = 0;i < n;i++){
    int x_get,y_get;cin>>x_get>>y_get; dis[i].number = i;dis[i].val = (x-x_get)*(x-x_get)+(y-y_get)*(y-y_get);}sort(dis,dis+n,cmp);//这个注意一下,sort函数for(int i=0;i<3;i++){
    cout<<dis[i].number+1<<endl;//加1是因为数组是从0开始}return 0;
}

第一题卡了半天,心态崩啦。

  相关解决方案