最短距离之和
针对问题:
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;
}
}