「csp模擬試題202009-1」稱檢測點查詢 C/C++

soloplayers發表於2020-12-04

目錄

  • 題目
  • 輸入輸出樣例
  • 題解思路
  • 題解原始碼(c/c++)

題目 :稱檢測點查詢

題目背景

2020 年 6 月 8 日,國務院聯防聯控機制釋出《關於加快推進新冠病毒核酸檢測的實施意見》,提出對“密切接觸者”等八類重點人群“應檢盡檢”,其他人群“願檢盡檢”。

問題描述

某市設有 n 個核酸檢測點,編號從 1 到 n,其中 i 號檢測點的位置可以表示為一個平面整數座標 (xi, yi)。為方便預約核酸檢測,請根據市民所在位置 ,查詢距其最近的三個檢測點。多個檢測點距離相同時,編號較小的視為更近。

輸入格式

輸入共 n+1 行。

第一行包含用空格分隔的三個整數 n、X 和 Y,表示檢測點總數和市民所在位置。

第二行到第 n+1 行依次輸入 n 個檢測點的座標。第 i+1 行(1 <= i <= n)包含用空格分隔的兩個整數 xi 和 yi,表示 i 號檢測點所在位置。

輸出格式

輸出共三行,按距離從近到遠,依次輸出距離該市民最近的三個檢測點編號。

評測用例規模與約定

全部的測試點滿足 3≤n≤200,所有座標均為整數且絕對值不超過 1000。


輸入輸出樣例

  • 輸入樣例1
3 2 2
2 2
2 3
2 4
  • 輸出樣例1
1
2
3
  • 輸入樣例2
5 0 1
-1 0
0 0
1 0
0 2
-1 2
  • 輸出樣例2
2
4
1

題解思路

題目要求依次輸出距離該市民最近的三個檢測點編號,我們關心的只有距離和編號。建立一個只有距離和編號的結構體,最後進行排序。當距離不等的時候,距離最小的一個結構體在最前面,距離相等的時候,編號最小的在前面。

題解(c/c++)

#include<bits/stdc++.h>
using namespace std;
double distance(int a,int b,int x,int y)
{
    return pow(x-a,2)+pow(y-b,2);
}
struct p_person
{
    int flag_inputNum;//座標,輸入的第幾個
    double dis;
};
int main(void)
{
    int n,X,Y;
    struct p_person test[210]={0};
    cin>>n>>X>>Y;
    for (int i=0;i<n;i++)
    {
        int x,y;
        cin>>x>>y;
        test[i].flag_inputNum=i+1;
        test[i].dis=distance(x,y,X,Y);
    }
//    從小到大排序
    for (int i=0;i<n-1;i++)
    {
        for(int j=i+1;j<n;j++)
        {
            if(test[i].dis>test[j].dis)
            {
                struct p_person temp=test[i];
                test[i]=test[j];
                test[j]=temp;
            }
            else if(test[i].dis==test[j].dis)
            {
                if(test[i].flag_inputNum>test[j].flag_inputNum)
                {
                    struct p_person temp=test[i];
                    test[i]=test[j];
                    test[j]=temp;
                }
            }
        }
    }
    for(int i=0;i<3;i++)
    {
        cout<<test[i].flag_inputNum<<endl;
    }
    return 0;
}

相關文章