`
hengjie10
  • 浏览: 24192 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

输油管道问题

 
阅读更多

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

如果只有一口井,那么显然是越近越好啦 如果有两口井,那么显然是有以下三种情况: 1.两口井都在主管道北边,那么这个时候的两个连接管道的长度和肯定大于两口井的Y坐标之差 2.两口井都在主管道南边,和情况1是一样的 3.两口井,一个在主管道南边,一个在主管道北边,那么两个连接管道的长度和就等于两口井的Y坐标之差 显然情况三是所要的最短管道的设计情况 就是当主管道在两口井之间的任意位置时,连接管道长度之和都等于两口井的Y坐标之差,是最短的长度 那么将这个结论推广,当有n口井的时候, 1.n是偶数 只要这n口井分布在主管道的两边,一边n/2个,那么就是距离之和最小的 2.n是奇数 只要将这n个井中,Y坐标最中间的(也就是Y是中值的那个)井不算,其余的偶数个井分布在主管道的两侧,这个时候移动主管道,那么这n个连接管道长度之和就决定于那个没有算的井了,因为其余的井的距离之和是固定了的,这个时候只要主管道最接近那个点就好了呀

代码为:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define LEN 100
int Random(int p, int r){//随机化
return rand()*(r-p)/32767+p;
}
void Swap(int &a, int &b){
int temp = a;
a = b;
b = temp;
}
int Partition(int y[LEN], int p, int r){
int i = p, j = r+1;
int x = y[p];
while(true){
while(y[++i]<x&&i<r);
while(y[--j]>x);
if(i>=j) break;
Swap(y[i],y[j]);
}
y[p] = y[j];
y[j] = x;
return j;
}
int RandomizedPartition(int y[LEN], int p, int r){
int i = Random(p,r);
Swap(y[i],y[p]);
return Partition(y,p,r);
}
int RandomizedSelect(int y[LEN], int p, int r, int k){
if(p==r) return y[p];
int i = RandomizedPartition(y,p,r);
int j = i-p+1;
if(k<=j) return RandomizedSelect(y,p,i,k);
else return RandomizedSelect(y,i+1,r,k-j);
}


void main(){
int n;//油井数
int sum = 0;//管道长度总和
int y[LEN];//油井y坐标
int dy;//油井y坐标中位数
scanf("%d",&n);//读取油井数
for(int i=0;i<n;i++){
scanf("%d",&y[i]);//x坐标在此题中无用,而y坐标在x坐标之后写入。因此两次写入一样的数组y[LEN]
scanf("%d",&y[i]);
}

dy = RandomizedSelect(y, 0, n-1, (n+1)/2);//中位数求取
for(i=0; i<n; i++)
sum+=abs(y[i]-dy);//计算管道和
printf("%d\n",sum);
}

分享到:
评论

相关推荐

    输油管道问题算法源程序

    在IT领域,输油管道问题是一个经典的算法应用实例,它主要涉及到数据结构和算法的设计与分析。本项目中,我们有一个名为"输油管道问题算法源程序"的压缩包,其核心是通过VC6.0集成开发环境实现的C++代码。这个程序...

    用c++编写输油管道问题

    这个场景可以类比于在一系列输油管道中找到最优的集中点,以最小化所有管道到该集中点的距离总和,因此被称为“输油管道问题”。下面将详细解析这段代码的关键知识点: ### 1. 快速排序算法(Quick Sort) 代码中...

    输油管道问题 算法设计

    从给定的文件信息来看,标题为“输油管道问题 算法设计”,描述较为模糊,仅提及了资源在特定环境下可能无法运行,但整体可用。标签则明确指向了“最短问题”和“算法设计”。代码部分展示了一个用C语言编写的程序,...

    c语言中的输油管道问题

    ### C语言中的输油管道问题解析 #### 一、背景介绍 在计算机科学与软件工程领域,特别是针对数据处理和优化问题时,经常会遇到需要通过算法来解决的问题。本篇文章将探讨一个具体的问题:如何利用C语言来解决“输油...

    输油管道问题.cpp

    输油管道问题,程序设计,程序源码……………… 内含具体设计方法

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

    ### 输油管道问题 #### 背景介绍 在石油开采行业中,为了高效地将各个油井中的原油运输至集中处理站点,常常需要构建复杂的输油管道网络。本篇文章主要探讨了一个具体的数学优化问题——如何设计一条从东向西延伸...

    输油管道问题-参考代码

    ### 输油管道问题详解 #### 一、问题背景与描述 在某石油公司的项目规划中,计划建造一条从东向西延伸的主输油管道,这条管道需要穿越一个包含 n 口油井的油田区域。根据工程设计的要求,每口油井都需要通过一条...

    输油管道问题的Java实现的代码

    输油管道问题 某石油公司计划建造一条由东向西的主输油管道。该管道要穿过一个有n 口油井的油田。从每口油井都要有一条输油管道沿最短路经(或南或北)与主管道相连。如果给定n口油井的位置,即它们的x 坐标(东西向)...

    输油管道问题的设计与实现

    ### 输油管道问题的设计与实现 #### 背景介绍 在现代石油行业中,为了将原油从油井运输到加工地点或储存设施,通常需要设计并建立高效的输油管道网络。其中,一个重要的问题是确定主输油管道的最佳位置,使得所有...

    8.输油管道问题.rar

    本话题聚焦于“输油管道问题”,这其实是一个用排序算法来解决的实际应用场景。输油管道问题通常涉及如何有效地调度多个管道,以最大化输送石油或其他液体的效率。 在石油工业中,输油管道系统是一个复杂网络,由多...

    输油管道问题ppt讲义

    输油管道问题是一个经典的算法分析问题,涉及到在二维空间中寻找一条直线,使得所有油井到这条直线的垂直距离之和最小。这个问题的实际背景是优化石油公司的输油网络,以减少建设成本。在这个问题中,我们有 n 口...

    算法分析,输油管道问题c程序

    ### 算法分析:输油管道问题C程序解析 #### 实验背景及目标 **实验目的:** 本实验旨在使学生熟练掌握分治法的相关概念及其递归表达式的应用,并能够运用分治法解决现实生活中的实际问题。 **实验要求:** 学生...

    输油管道问题(分治)定义.pdf

    输油管道问题是一个典型的计算机科学中的分治策略应用实例,主要目标是确定一条主管道的最佳位置,以使得所有油井到主管道的输油管道长度之和最小。问题描述如下: 1. 油田中有n口油井,每口油井都有其东西方向的x...

    输油管道问题C解输油管道问题C解输油管道问题C解

    #include "stdio.h" #include "stdlib.h" #include "math.h" main() {int i,j,sum=0,n,mode=0,temp,z; scanf("%d",&n); int a[n+1]; for(i=1;i;i++) scanf("%d%d",&z,&a[i]); for(i=1;i;... }

    输油管道 问题

    根据给定的信息,本文将详细解释“输油管道问题”的背景、问题定义、解决方法以及相关的编程实现细节。 ### 背景介绍 在石油工业中,为了有效地运输原油,通常需要建立复杂的输油管道网络。这些网络不仅连接着各个...

Global site tag (gtag.js) - Google Analytics