输油管道问题

来源:互联网 发布:淘宝网注册支付宝密码 编辑:程序博客网 时间:2024/05/16 00:24

问题描述:
 某石油公司计划建造一条由东向西的主输油管道。该管道要穿过一个有n口油井的油田。从每口油井都要有一条输油管道沿最短路经(或南或北)与主管道相连。如果给定n口油井的位置,即它们的x坐标(东西向)和y坐标(南北向),应如何确定主管道的最优位置,即使各油井到主管道之间的输油管道长度总和最小的位置?证明可在线性时间内确定主管道的最优位置。
 
编程任务:
 给定n口油井的位置,编程计算各油井到主管道之间的输油管道最小长度总和。
 
数据输入:
 由文件pipe*.in提供输入数据。文件的第1行是油井数n,1n10000。接下来n行是油井的位置,每行2个整数x和y,-10000x,y10000。

结果输出:
 程序运行结束时,将计算结果输出到文件pipe*.out中。文件的第1行中的数是油井到主管道之间的输油管道最小长度总和。
 
 
输入文件示例 输出文件示例 
pipe0.in pipe0.out 
5
1 2
2 2
1 3
3 -2
3 3 6 

int partition(int a[],int p,int r)
{//快速排序的划分函数
int i,j,x,temp;
i=p;
j=r+1;
x=a[p];
//将<=x的元素换到左边区域
//将>=x的元素换到右边区域
while (1)
{
while (a[++i]<x);
while(a[--j]>x);
if (i>=j)break;
temp=a[i];
a[i]=a[j];
a[j]=temp;
}
a[p]=a[j];
a[j]=x;
return j;
}
int randpartition(int a[],int p,int r)
{//随机划分函数
int i;
i=p+rand()%(r-p+1);//生产随机数
int temp;
temp=a[i];
a[i]=a[p];
a[p]=temp;
return partition(a,p,r);//调用划分函数
}
int randsel(int a[],int p,int r,int k)
{//查找中位数函数
if (p==r)//递归结束,找到中位数
{
return a[p];
}
int i,j;
i=randpartition(a,p,r);//划分
j=i-p+1;
if (k==j)//递归结束,找到中位数
return a[i];
if (k<j)
{
return randsel(a,p,i-1,k);//递归调用,在前面部分查找中位数
}
else
return randsel(a,i+1,r,k-j);//递归调用,在后面部分查找中位数
}

 

原创粉丝点击