注:本文为洛谷用户 zhangsenhao6728(也就是我)的题解,已提交成功。
曼哈顿改了两次了。
前置知识
- 曼哈顿距离。
曼哈顿距离是指一个坐标只能通过上下左右移动到另一个坐标的最短距离。
( x , y ) → ( x ′ , y ′ ) (x,y)\rightarrow(x^\prime,y^\prime) (x,y)→(x′,y′) 曼哈顿距离公式: ∣ x − x ′ ∣ + ∣ y − y ′ ∣ \lvert x-x^\prime\rvert+\lvert y-y^\prime\rvert ∣x−x′∣+∣y−y′∣。
- 中位数。
是指一个序列排序后位于最中间的数。
思路讲解
注意了啊,这里选的是格子里个任意一点,并非一定要是某个人的位置(被卡了好长时间啊)。
题目很简单,由于两个坐标求曼哈顿距离是横坐标相减,纵坐标相减,所以这里的横坐标和纵坐标不用放在一起考虑。
主要思路就是把横坐标,纵坐标分别排序,用排序后的纵坐标序列的中位数做选择地点的纵坐标;用排序后的横坐标序列的中位数做选择地点的横坐标。因为中位数和其他数的差之和最小。
AC 代码
很简单的呀。
#include<bits/stdc++.h>
using namespace std;
int x[50001],y[50001];
int main(){
int t,k;
cin>>t;
while(t--){
cin>>k>>k>>k;//因为前两个数据没啥用,所以省略。诶,输入竟是kkk
for(int i=1;i<=k;i++){
cin>>x[i]>>y[i];
}
sort(x+1,x+k+1);
sort(y+1,y+k+1);
int mx=x[(int)ceil(k/2.0)];
int my=y[(int)ceil(k/2.0)];
printf("(Street: %d, Avenue: %d)\n",mx,my);
}
return 0;
}