CSP认证202009-1称检测点查询

CSP认证202009-1称检测点查询

非常非常简单的题,只要你会任意一种排序,而且排序算法都不用自己写的那种,然后懂一点结构体的知识或者STL的知识就行了,直接上代码吧。


#include <iostream>
#include <cmath>
#include <algorithm>
using namespace std;

struct point
{
    int x,y;
    int num;//序号
    int d;
};

bool cmp(point p1,point p2)
{
    if(p1.d==p2.d) return p1.num<p2.num;
    else
    return p1.d<p2.d;
}

int main()
{
    point p[210];
    int n,X,Y;
    cin>>n>>X>>Y;
    for(int i=0;i<n;i++)
    {
        cin>>p[i].x>>p[i].y;
        p[i].num=i;
        p[i].d=((X-p[i].x)*(X-p[i].x)+(Y-p[i].y)*(Y-p[i].y));
    }
    sort(p,p+n,cmp);
    /*for(int i=0;i<n;i++)
    {
        cout<<i<<" "<<p[i].d<<" "<<p[i].num<<endl;
    }*/
    for(int i=0;i<3;i++) cout<<p[i].num+1<<endl;
    return 0;
}

有个地方我很傻就是当两个点的距离相等时,序号小的排在前面,这里我过分依靠了sort函数,但其实他并没有给你像那样默认排好,需要自己在写的cmp函数中再加上一段此种情况的判断语句,这样才算是完成了,之前一直是60分,就是因为这个地方浪费了好多时间,小伙伴可以定要注意啊!不过奇怪的是,我看了另外一个博主的代码却完美的100分过去了,也没弄清楚之中的原理,有兴趣的小伙伴看看,求大佬指出来。链接附上https://blog.csdn.net/qq_43337263/article/details/108889084

上一篇:Educational Codeforces Round 100 (Rated for Div. 2)


下一篇:二分查找