您的位置:首页 > 其它

NYOJ7——街区最短路径问题

2015-07-17 14:10 435 查看

街区最短路径问题

时间限制: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


解题思路:

1)如果要求得最短,邮局必然得建在给出的居民点的其中一点上;

2)因为不能走对角线,所以就相当于仅仅计算在x轴,y轴上距离最短之和。也就可以将xy轴分开考虑,来在给定的点中找中间点

代码:

#include<iostream>
#include<cmath>
#include<algorithm>
using namespace std;

int main()
{
int n,m,x[21],y[21];
cin>>n;

while(n--)
{

int sum=0;
cin>>m;
for(int i=0;i<m;i++)
{
cin>>x[i];
cin>>y[i];

}
sort(x,x+m);
sort(y,y+m);

for(int j=0;j<m/2;j++)//要找中间点,就直接用倒数第一个点减第一个点,倒数第二个点减第二个点
sum+=abs(x[m-j-1]-x[j])+abs(y[m-j-1]-y[j]);

cout<<sum<<endl;

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