街区最短路径问题
时间限制: 3000 ms | 内存限制: 65535 KB
难度: 4
- 描写叙述
- 一个街区有非常多住户,街区的街道仅仅能为东西、南北两种方向。 住户仅仅能够沿着街道行走。 各个街道之间的间隔相等。 用(x,y)来表示住户坐在的街区。 比如(4,20),表示用户在东西方向第4个街道,南北方向第20个街道。 如今要建一个邮局,使得各个住户到邮局的距离之和最少。 求如今这个邮局应该建在那个地方使得全部住户距离之和最小;
- 输入
- 第一行一个整数n<20,表示有n组測试数据,以下是n组数据; 每组第一行一个整数m<20,表示本组有m个住户,以下的m行每行有两个整数0<x,y<100,表示某个用户所在街区的坐标。 m行后是新一组的数据; 输出
- 每组数据输出到邮局最小的距离和,回车结束; 例子输入
-
231 12 11 252 9 5 2011 91 11 20
例子输出 -
244
-
分析:因为仅仅能上下左右通路,所以先把横竖坐标分开,分别求他们的最值; 1、从平面一维分析,如果坐标轴上有1、2、3……n个点,目标点在x。2、先求点1和n到x的距离之和。非常明显,x必须在1和n之间。3、再求点2和n-1到x的距离之和。非常明显,x必须在2和n-1之间……4、如此下去,终于x的范围不断缩小,最后的位置,就是中位数的位置了。
-
#include
#include using namespace std;int main(){ int T,i,j,n,sum; int a[110]={0}; int b[110]={0}; scanf("%d",&T); while(T--) { sum=0; scanf("%d",&n); for(i=0;i