• 全部
  • 问答

关于输油管道问题

outiejun 北京美乐科技有限公司(世纪电器网) CTO  2007-10-28 01:08:21
某石油公司计划建造一条由东向西的主输油管道。该管道要穿过一个有n口油井的油田。从每口油井都要有一条输油管道沿最短路径(或南或北)与主管道相连。如果给定n口油井的位置,即它们的x坐标和y坐标,应如何确定主管道的最优位置,即使各油井到主管道之间的输油管道长度总和最小的位置?证明可在线性时间内确定主管道的最优位置。

附件中是我的想法,但是有人说我的式子转化是不等价的,我不知道哪里错了,如果不对,该如何证明这个问题,请各位大虾给点意见,thanks
...全文
1893 点赞 收藏 5
写回复
5 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
camel_flying 2009-03-05
知道为什么中位数吗??
理论上说为什么是它?
回复
C1053710211 2007-10-29
对于一个已经排好序的点出现在坐标轴上,先假设是两个点x1,x2,那么在这两点之间的任意点到这两点的距离和是这两个点之间的距离,即|x1-x2|,如果取x1,x2险段延长线上的点x3,那么就是|x1-x2|+|x3-x2|*2或者|x1-x2|+|x3-x1|*2,都比上面的情况大,同理多个点的情况下,要找所有点的中间点,如果排序后是
x1,x2,x3,x4,...,xn,那么最小距离是=Xn-X1+Xn-1-X2+Xn-2-X3+...,
回复
outiejun 2007-10-28
感谢楼上,我猜想也是中位数,但是怎么证明呢,为什么是中位数?
回复
C1053710211 2007-10-28
应该是c=0,手误,-_-!
回复
C1053710211 2007-10-28
lz确实有转化的错误,绝对值和的最小值,不是平方和的最小值
如果有 a*a+b*b<c*c+d*d 不一定有|a|+|b|<|c|+|d|
因为2*a*b和2*c*d的作用,设a=4,b=4,c=2,d=7就和lz的假设矛盾
对于这个题时要寻找所有坐标排序后的中位数,但是快速排序是nlgn的时间复杂度
但是我们只要找到数组中第n/2大的数就可以了,可以使用快速排序的思想,并使用随即函数在O(n)的时间
内找到中位数,下面是代码

#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#define LEN 1024
using namespace std;
int RANDOM(int p,int r)
{
return rand()*(r-p)/32767+p;
}
int PARTITION(int arr[LEN],int p,int r)
{
int x = arr[r];
int i = p-1;
for(int j = p;j<r;j++)
{
if(arr[j]<=x)
{
++i;
int t = arr[i];
arr[i] = arr[j];
arr[j] = t;
}
}
int t = arr[i+1];
arr[i+1] = arr[r];
arr[r] = t;
return i+1;
}
int RANDOMIZED_PARTITION(int arr[LEN],int p,int r)
{
int i = RANDOM(p,r);
int t = arr[i];
arr[i] = arr[r];
arr[r] = t;
return PARTITION(arr,p,r);
}
int RANDOMIZED_SELECT(int arr[LEN],int p,int r,int i) //找到arr中第i小的数,数组下标从1开始
{
if(p==r) return arr[p];
int q = RANDOMIZED_PARTITION(arr,p,r);
int k = q-p+1;
if(i==k) return arr[q];
else if(i<k)
return RANDOMIZED_SELECT(arr,p,q-1,i);
else return RANDOMIZED_SELECT(arr,q+1,r,i-k);
}
int main()
{
int n,arr[]={45,67,32,78,4,23,567,78,34,0,78};
while(scanf("%d",&n)==1)
{
printf("%d\n",RANDOMIZED_SELECT(arr,0,10,n));
}
return 0;
}
回复
发帖
数据结构与算法
创建于2007-08-27

3.2w+

社区成员

数据结构与算法相关内容讨论专区
申请成为版主
帖子事件
创建了帖子
2007-10-28 01:08
社区公告
暂无公告