算法设计与分析 | 输油管道

题目

某石油公司计划建造一条由东向西的主输油管道。该管道要穿过一个有n 口油井的油田。从每口油井都要有一条输油管道沿最短路经(或南或北)与主管道相连。如果给定n口油井的位置,即它们的x 坐标(东西向)和y 坐标(南北向),应如何确定主管道的最优位置,即使各油井到主管道之间的输油管道长度总和最小的位置?

输入

文件的第1行是油井数n,1≤n≤10000。

接下来n行是油井的位置,每行2个整数x和y,-10000≤x,y≤10000。

输出

编程计算各油井到主管道之间的输油管道最小长度总和。

样例输入

5
1 2
2 2
1 3 
3 -2
3 3

样例输出

6

分析

1.问题实际上可以转化成一维问题,即油井到管道的距离只喝纵坐标有关,故可以将对象抽象到一条y方向的数轴上面。
2.已知,如果是两个井,则管道穿过二者中间;如果是三个井,则管道穿过最中间的一个点。归纳一下即为,管道的纵坐标应该是所有油井的纵坐标的中位数。

所以可以先对纵坐标进行升序排序,然后再求各个油井到“中位数”油井的距离。

代码

//输油管道
#include
#include
int a[100][100];
int b[100];
//排序
void sort(int k)
{
	int i, j, t;
	for (i = 0; i < k; i++)
	{
		for (j = 0; j < k - i - 1; j++)
			if (b[j] > b[j + 1]) {
				t = b[j];
				b[j] = b[j + 1];
				b[j + 1] = t;
			}
	}
}
int method1(int k)
{
	int i, sum = 0;
	for (i = 0; i < k; i++)
		sum = sum + abs(b[i] - b[k / 2]);
	return sum;
}
int main()
{
	int n=0, i=0, j=0, k = 0;
	//输入油井个数
	scanf("%d", &n);
	for (int x = 0; x < n; x++) {
		//输入各油井坐标
		scanf("%d %d", &i, &j);
		b[k++] = j;
	}
	sort(k);
	printf("%d", method1(k));
}

你可能感兴趣的:(算法设计与分析,算法,数据结构,开发语言)