SSL-ZYC 抓捕嫌疑犯

本文介绍了一种通过计算距离并使用快速排序算法来找出指定范围内第k远人员的方法。适用于跟踪场景中快速识别目标人物。

题目大意:
小Z接到命令去跟踪一个嫌疑犯。他一路跟踪走进一家商场,忽然那个人不见了。就在他焦急万分之际,耳机里响起了指挥部长官的声音:小Z听着,据我们监视,在你周围的人中,嫌疑犯距你第k远,请快速确认目标,实施抓捕!
给出小Z的当前置和周围所有人的位置,请你帮助小Z确认哪些人可能是嫌疑犯。
注意:嫌疑犯可能有多个!


思路:
这道题有点暴力模拟的成分。我们先用勾股定理求出每个人与小Z的距离,然后快排,最后再找出答案。
勾股定理详情见我博客 剑鱼行动


代码:

#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;
int x,y,n,m,xx,yy,sum,k,a[30001],b[30001],i,j;
double f[30002];
char c;

void sorts(int l,int r)  //快排代码 
{
    int i,j;
    double t,z;
    i=l;
    j=r;
    z=f[(i+j)/2];
    do
    {
        while (f[i]<z) i++;
        while (f[j]>z) j--;
        if (i<=j)
        {
            t=f[i]; f[i]=f[j]; f[j]=t;
            swap(a[i],a[j]);
            swap(b[i],b[j]);
            i++; j--;
        }
    }
    while (i<j);
    if (i<r) sorts(i,r);
    if (j>l) sorts(l,j);
}

void sortt(int l,int r)  //也是快排代码 
{
    int i,j,z;
    double t;
    i=l;
    j=r;
    z=(i+j)/2;
    do
    {
        while (a[i]<a[z]||(a[i]==a[z]&&b[i]<b[z])) i++;
        while (a[j]>a[z]||(a[j]==a[z]&&b[j]>b[z])) j--;
        if (i<=j)
        {
            swap(a[i],a[j]);
            swap(b[i],b[j]);
            i++; j--;
        }
    }
    while (i<=j);
    if (i<r) sortt(i,r);
    if (j>l) sortt(l,j);
}

int main()
{
    freopen("suspect.in","r",stdin);
    freopen("suspect.out","w",stdout);
    f[30001]=2147483646;
    scanf("%d%d%d%d",&x,&y,&n,&m);
    for (i=1;i<=n;i++)
    {
        scanf("%d%d",&a[i],&b[i]);
        f[i]=sqrt((x-a[i])*(x-a[i])+(y-b[i])*(y-b[i]));  //勾股定理计算距离 
    } 
    sorts(1,n);  //快排 
    sum=0;
    for (i=n;i>=1;i--)  //寻找距离小Z第k远的人 
    {
        if (f[i]!=f[i+1]) sum++;
        if (sum==m) break; 
    }
    j=i-1;
    sum=1;
    while (f[j]==f[i])  //记录有多少个距离他第k远的人 
    {
        j--;
        sum++;
    }
    j++;
    printf("%d\n",sum);
    sortt(j,i);  //快排 
    for (int q=j;q<=i;q++)
     printf("%d %d\n",a[q],b[q]);
    scanf("%c",&c);
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值