20.良乡供暖站

若干年以后,良乡校区已经全部建设完毕。有许多的建筑和道路,它们纵横交错形成一个 n * m 的棋盘式网状布局。这个棋盘中的每一个横行和纵行均为一条道路,在某些道路交叉点上具有一栋建筑。每一栋建筑可以由一个二维坐标 (x, y) 表示,表示这一栋建筑处于第 x 横行、第 y 纵行的两条道路的交叉点上。

现在,良乡要在某一个道路交叉点上(可能已经有建筑)新建立一个供暖站。新的供暖站将修建供热管道到已有的每一栋建筑。为了方便维修,供暖管道只能直接修建在道路之下。为了最小化成本,良乡管理处想要让要修建的管道的总长度最小。

假定这个道路“棋盘”是单位均匀的(也就是每一个交叉点到相邻的四个交叉点之间的距离均为1)。现在良乡管理处想要知道,他们最少需要修建多长的管道。

输入

输入文件第一行为一个整数 N (1 <= N <= 100’000),表示已有建筑的数量。

接下来的 N 行,每行包含两个以空格分隔的整数 x 和 y (-1’000’000’000 <= x, y <= 1’000’000’000),分别表示每一栋建筑的坐标。

输出

输出一行一个整数表示需要新修建的管道的最短长度。

样例解释

对于第一组测试用例,供暖站应该建在坐标 (0, 0) 处,其到三个已有建筑的距离分别为 2, 2, 0,因此总距离为 4;

对于第二组测试用例,供暖站直接建在 (50, 50) 处即可。

又一道良心题,把横纵坐标分别存入两个数组中,分别排序,答案就是两个数组首尾之差累计相加的和,注意答案是long long型,而且n为奇数时中间项不参与计算。

#include<stdio.h>
#include<stdlib.h>
#define N 100005
int n,x[N],y[N];
long long ans,sumx,sumy;
int cmp(const void *a,const void *b)
{
	return *(int *)a-*(int *)b;
}
int main()
{
	scanf("%d",&n);
	for(int i=0;i<n;i++)
		scanf("%d %d",&x[i],&y[i]);
	qsort(x,n,sizeof(x[0]),cmp);
	qsort(y,n,sizeof(y[0]),cmp);
	if(n==1)
	{
		printf("0\n");
		return 0;
	}
	else
	{
		ans=0,sumx=0,sumy=0;
		for(int i=0;i<n/2;i++)
		{
			sumx+=(x[n-1-i]-x[i]);
			sumy+=(y[n-1-i]-y[i]);
		}
		ans=sumx+sumy;
		printf("%lld\n",ans);
		return 0;
	}
}

猜你喜欢

转载自blog.csdn.net/ArgentumHook/article/details/83240288