问题描述:
问题描述:
某石油公司计划建造一条由东向西的主输油管道。该管道要穿过一个有n 口油井的油田。从每口油井都要有一条输油管道沿最短路经(或南或北)与主管道相连。如果给定n 口油井的位置,即它们的x 坐标(东西向)和y 坐标(南北向),应如何确定主管道的最优位置, 即使各油井到主管道之间的输油管道长度总和最小的位置?证明可在线性时间内确定主管道的最优位置。
编程任务:
给定n 口油井的位置,编程计算各油井到主管道之间的输油管道最小长度总和。
数据输入:
由文件input.txt 提供输入数据。文件的第1 行是油井数n,1<=n10000。接下来n 行是油井的位置,每行2 个整数x 和y,-10000<=x,y<=10000 。
结果输出:
程序运行结束时,将计算结果输出到文件output.txt 中。文件的第1 行中的数是油井到主管道之间的输油管道最小长度总和。
输入文件示例 输出文件示例
input.txt output.txt
5 6
1 2
2 2
1 3
3 -2
3 3
代码如下:
#include <iostream> #include <algorithm> using namespace std; #define N 10000 bool cmp(int a,int b){ return a<b; } int main() { int n;cin>>n; int X=0, Y=0;//(X,Y)记录邮局位置 int MinDis=0; int x[N],y[N]; for(int i=0;i<n;i++){ cin>>x[i]>>y[i]; } sort(x,x+n,cmp); sort(y,y+n,cmp); X=x[n/2];Y=y[n/2];//邮局位置找法思想,两边之和大于第三边 //将坐标两两分组,距离两点最近距离肯定在其两点间连线上,取交集即可; for(int i=0;i<n;i++){ int dis1=x[i]-X;int dis2=y[i]-Y; if(dis1<0) dis1=-1*dis1; if(dis2<0) dis2=-1*dis2; MinDis=MinDis+dis2; //只需要y坐标距离差的绝对值(与邮局选址问题不同,此题为东西走向管道,不需考虑X坐标) } cout<<MinDis<<endl; return 0; }