利用中位数求最短距离之和

最短距离之和

针对问题:

1.X轴上有N个点,求X轴上一点使它到这N个点的距离之和最小,输出这个最小的距离之和。

2.X轴上有N个点,求X轴上使它到这N个点的距离之和最小的点。

相关定理:

1.某点与两定点距离之和最小当且仅当动点在定点之间

2.推广:当定点数超过2时,某点与两定点距离之和最小,当且仅当动点在两侧定点数相同的定点之间或定点上(当定点数为奇数时,取中位数的点)

举例:

1 2 4 7 则取2 3 4都为距离定点的距离之和最短的点;

1 5 7 则取5为距离定点距离之和最短的点

例题:

东部展览

题意:给出一个二维图,其中n个点,找出可以到n个点的曼哈顿距离和最短的点的数量。

由题意可知,距离和其实和点在哪里关系不大,真正有关的是将n个点做代表的x,y轴的所有点到目标点的x,y轴的最短距离和。单看x轴或y轴,其问题就回到了一维的最短距离和,由上可知,以x轴为例,当n为奇数的时候,只有一个,当n为偶数的时候,可以找到有xn/2+1-xn/2+1个点(将x从大到小排好序后),y轴同理。x,y轴结合起来,在二维坐标下,将x轴上可以找到的点(横坐标),乘上y轴上可以找到的点(纵坐标)即为答案。

代码:

#include<bits/stdc++.h>
using namespace std;
const int M=1e5+5;
typedef long long ll;
ll x[M],y[M],t,n;
int main()
{
    cin>>t;
    while(t--)
    {
    cin>>n;
    for(int i=1;i<=n;i++)
    {
         cin>>x[i]>>y[i];
    }
    sort(x+1,x+1+n);
    sort(y+1,y+1+n);
    if(n&1)
    cout<<1<<endl;
    else
    cout<<(x[n/2+1]-x[n/2]+1)*(y[n/2+1]-y[n/2]+1)<<endl;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wizardAEI

喜欢就投喂一下吧O(∩_∩)O

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值