1076: 最短距离
题目描述
在河边有N户人家,他们每天都需要到河边去打水,后来政府拔款给大家修建一个水库。
每户人家到水库的最短距离为沿河方向的距离差,问如何选择水库的位置,使所有人到水库的距离和最短?
每户人家到水库的最短距离为沿河方向的距离差,问如何选择水库的位置,使所有人到水库的距离和最短?
输入
第一行输入一个数字Case,表示一共有多少组测试数据。
接下来Case个测试数据块。
每个测试数据块:第一行一个数字N,表示有N户人。
接下来一行有N个数字d,表示每户人家在河流方向上的坐标。
Case<=10,1<=N<=100000,0<=d<=2*10^9。
输出
对于每组测试数据,输出最短的距离和,一行一个结果。
样例输入
2
2
1 3
1
3
样例输出
2
0
提示
来源
#include<stdio.h>#include<string.h>sortquickly(int a[],int lenth){ int mid; mid = a[0]; int i,j; i=0; j=lenth-1; if(lenth>1) { while(i<j) { for(;j>i;j--) { if(a[j]<mid) { a[i++]=a[j]; break; } } for(;i<j;i++) { if(a[i]>mid) { a[j--]=a[i]; break; } } } a[i]=mid; sortquickly(a,i); sortquickly(a+i+1,lenth-i-1); }}main(){ int i,a[100001],lenth,N,h,p,o,mid,x,T,j; long sum; scanf("%d",&T); for(j=0;j<T;j++) { sum=0; scanf("%d",&N); h=N; for(i=0;i<N;i++) scanf("%d",&a[i]); sortquickly(a,N); if(h%2!=0) { p=(h-1)/2; mid=a[p]; for(o=0;o<p;o++) { x=mid-a[o]; sum=sum+x; } for(o=p+1;o<h;o++) { x=a[o]-mid; sum=sum+x; } } if(h%2==0) { p=h/2; p=p-1; mid=a[p]; for(o=0;o<p;o++) { x=mid-a[o]; sum=sum+x; } for(o=p+1;o<h;o++) { x=a[o]-mid; sum=sum+x; } } printf("%ld\n",sum);}}

浙公网安备 33010602011771号