洛谷 UVA855 Lunch in Grid City 题解

注:本文为洛谷用户 zhangsenhao6728(也就是我)的题解,已提交成功。

曼哈顿改了两次了。

前置知识

  1. 曼哈顿距离。

曼哈顿距离是指一个坐标只能通过上下左右移动到另一个坐标的最短距离。

( 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 xx+yy

  1. 中位数。

是指一个序列排序后位于最中间的数。

思路讲解

注意了啊,这里选的是格子里个任意一点,并非一定要是某个人的位置(被卡了好长时间啊)。

题目很简单,由于两个坐标求曼哈顿距离是横坐标相减,纵坐标相减,所以这里的横坐标和纵坐标不用放在一起考虑。

主要思路就是把横坐标,纵坐标分别排序,用排序后的纵坐标序列的中位数做选择地点的纵坐标;用排序后的横坐标序列的中位数做选择地点的横坐标。因为中位数和其他数的差之和最小。

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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值