输油管道问题
2007-04-12 10:43
204 查看
问题描述:
某石油公司计划建造一条由东向西的主输油管道。该管道要穿过一个有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);//递归调用,在后面部分查找中位数
}
某石油公司计划建造一条由东向西的主输油管道。该管道要穿过一个有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);//递归调用,在后面部分查找中位数
}
相关文章推荐
- P1862 输油管道问题
- Vijos 1691-输油管道问题【中位数】
- Vijos-P1691-输油管道问题(Java + 大西瓜......)
- 南邮-1206-输油管道问题
- 南邮 OJ 1206 输油管道问题
- 输油管道问题 分治算法
- 中位数应用:输油管道问题--快速排序、改进、变种
- 输油管道问题
- [递归与分治算法][BOJ]1031-输油管道问题
- 输油管道问题
- 【算法设计与分析】输油管道问题
- 算法导论——输油管道问题解法
- vijosp1691-中位数&贪心-输油管道问题
- Vijos 1691题:输油管道问题
- 输油管道问题
- 【a202】&&【9208】输油管道问题
- P1862输油管道问题
- 输油管道问题
- vijos p-1691;输油管道问题
- 输油管道问题