1. 程式人生 > 其它 >CCF 202009-1 稱檢測點查詢 (100分)

CCF 202009-1 稱檢測點查詢 (100分)

技術標籤:每日一測csp

題庫連結:https://blog.csdn.net/weixin_43905586/article/details/88404105

測試連結:http://cspro.org/

用時:1小時


分享名言一句

Knowledge is from work, any achievement is the crystallization of hard work. -- Song Qingling

知識是從勞動中得來的,任何成就都是刻苦勞動的結晶。——宋慶齡


問題描述

試題編號:202009-1
試題名稱:稱檢測點查詢
時間限制:1.0s
記憶體限制:256.0MB
問題描述:

題目背景

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號檢測點所在位置。

輸出格式

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

樣例輸入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

Data

樣例2解釋

評測用例規模與約定

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

提示

市民到第i號檢測點的距離Di可由如下公式算出:

鄙人拙見:

  1. 首先按要求輸入n,X,Y
  2. 利用公式分別求出市民與多個監測點的距離並對每個監測點編號
  3. 將距離按從小到大排序,注意把編號也帶上
  4. 若距離相等,則優先輸出小值
  5. 最後按序輸出前三位

C++參考程式碼1.0:

#include <iostream>
#include <bits/stdc++.h>

using namespace std;

int main()
{
    int n,X,Y;
    scanf("%d %d %d",&n,&X,&Y);
    int a[n][2];
    for(int i = 0; i < n; i++)
    {
        for(int j = 0; j < 2; j++)
        {
            scanf("%d",&a[i][j]);
        }
    }
    float distance[n];
    int flag[n];
    for(int i = 0; i < n; i++)
    {
        float sum;
        sum = abs(a[i][0] - X)*abs(a[i][0] - X) + abs(a[i][1] - Y)*abs(a[i][1] - Y);
        distance[i] = sqrt(sum);
        flag[i] = i + 1;
    }
    for(int i = 0; i < n; i++)
    {
        for(int j = i + 1; j < n; j++)
        {
            float temp;
            int t;
            if(distance[j] < distance[i])
            {
                temp = distance[i];
                distance[i] = distance[j];
                distance[j] = temp;
                t = flag[i];
                flag[i] = flag[j];
                flag[j] = t;
            }
            if(distance[j] == distance[i])
            {
                if(flag[i] > flag[j])
                {
                    t = flag[i];
                    flag[i] = flag[j];
                    flag[j] = t;
                }
            }
        }
    }
    for(int i = 0; i < 3; i++)
    {
        printf("%d\n",flag[i]);
    }
    return 0;

}

尾言:作者水平有限,讀者思維無限,若有細節錯誤請見諒,若有好的想法,歡迎評論區留言。