您的位置:首页 > 其它

NYOJ-街区最短路径问题

2016-02-13 14:11 423 查看


街区最短路径问题

时间限制:3000 ms  |  内存限制:65535 KB
难度:4

描述一个街区有很多住户,街区的街道只能为东西、南北两种方向。

住户只可以沿着街道行走。

各个街道之间的间隔相等。

用(x,y)来表示住户坐在的街区。

例如(4,20),表示用户在东西方向第4个街道,南北方向第20个街道。

现在要建一个邮局,使得各个住户到邮局的距离之和最少。

求现在这个邮局应该建在那个地方使得所有住户距离之和最小;

输入第一行一个整数n<20,表示有n组测试数据,下面是n组数据;

每组第一行一个整数m<20,表示本组有m个住户,下面的m行每行有两个整数0<x,y<100,表示某个用户所在街区的坐标。

m行后是新一组的数据;

输出每组数据输出到邮局最小的距离和,回车结束;
样例输入
2
3
1 1
2 1
1 2
5
2 9
5 20
11 9
1 1
1 20


样例输出
2
44


我也是醉了,就是查找X坐标和Y坐标的中位数,然后进行计算距离即可,但是没想到,用户的居住地也可以设置成邮局。。。。。

#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cmath>
using namespace std;
typedef struct {
int x;
int y;
}Node;
int N;
bool Cmx(const Node h1,const Node h2) {
return h1.x < h2.x;
}
bool Cmy(const Node h1,const Node h2) {
return h1.y < h2.y;
}
Node node[25];
int main() {
//freopen("in.txt", "r", stdin);
int n;
scanf("%d", &N);
while(N--) {
scanf("%d", &n);
for (int i = 0; i < n; i++) {
scanf("%d%d", &node[i].x, &node[i].y);
}
sort(node, node+n, Cmx);
int x = node[n/2].x;
sort(node, node+n, Cmy);
int y = node[n/2].y;
int sum = 0;
for (int i = 0; i < n; i++) {
sum += fabs(node[i].x - x);
sum += fabs(node[i].y - y);
}

printf("%d\n",sum);
}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: