让我们来看一条算法问题:

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

输入:首行为油井数量n,其他行为每口油井的横坐标xi,纵坐标yi
输出:油井到主管道之间的输油管道最小长度总和。

解析:

看完题目我们脑海里首先出现的就是一个平面坐标轴,并且只有第一象限。而因为输油管道是从东向西的平行于x轴的一条直线,那么其解析式必然是y=n(n为常数)。
然后现在问题是要让所有油井到输油管道的距离之和最短,距离就是纵坐标之差的绝对值,所以距离之和纵坐标有关,所以横坐标与本题的关系不大。
要距离之和最短,很明显,管道的纵坐标肯定是介于最小纵坐标和最大纵坐标之间的一个值。所以我们在输入所有的纵坐标之后,通过排序知道最大的纵坐标和最小的纵坐标之后,便可以从最小值开始进行尝试。定义一个整型,并将最小值作为油管时的距离之和作为初值。一个个试,若距离之和小于这个变量,便将其替换,最后输出最小值。
理清主要思路之后我们就可以开始写代码了。
我就用C++来写了

代码如下:

#include<iostream>
using namespace std;

int main(){
    int n;//输入油井个数,用来定义数组。
    int a[100];//横坐标。
    int b[100];//纵坐标。
    int ma,mi;//记录纵坐标的最大值。
    int re=100;//最终的最优结果。
    int sum=0;//每次的长度总和。
    cin>>n;
    for(int i=0;i<n;i++){
        cin>>b[i]>>a[i];
    }                   //输入油井数量和分别的横纵坐标值。
    ma=a[0];
    mi=a[0];            //先定义最大和最小值。
    for(int i=0;i<n;i++){
        if(a[i]>ma){
            ma=a[i];
        }
        if(a[i]<mi){
            mi=a[i];
        }
    }                   //找到最大值和最小值。
    for(int i=mi;i<ma+1;i++){
        for(int j=0;j<n;j++){
            if(a[j]>i){
                sum=sum+(a[j]-i);
            }
            else{
                sum=sum+i-a[j];
            }
        }
        if(sum<re){
            re=sum;
            sum=0;
        }
    }                    //计算每个位置长度之和,并求得最优解。
    cout<<re;
}

这个问题就这么解决了。

输油管道问题(分治算法)相关推荐

  1. C++:分治算法之输油管道问题

    目录 描述 输入 输出 输入样例 输出样例 分析 代码 运行结果 描述 ¢ 某石油公司计划建造一条 由东向西 的主输油管道.该管道要穿过一个有n口油井的油田.从每口油井都要有一条输油管道沿最短路经(或 ...

  2. 漫画:5分钟弄懂分治算法!它和递归算法的关系!

    分治顾名思义"分而治之",英文的意思翻译为"分割并征服". 分治思想,简而言之就是将原问题分解成与"原问题相同但是规模更小"的子问题,并可以 ...

  3. 三十三、分治算法---汉诺塔问题

    一.分治算法的介绍 分治法是一种很重要的算法.字面上的解释是"分而治之",就是把一个复杂的问题分成两个或更多的相同或 相似的子问题,再把子问题分成更小的子问题--直到最后子问题可以 ...

  4. 快速排序 c++_算法浅谈——分治算法与归并、快速排序(附代码和动图演示)

    本文始发于个人公众号:TechFlow 在之前的文章当中,我们通过海盗分金币问题详细讲解了递归方法. 我们可以认为在递归的过程当中,我们通过函数自己调用自己,将大问题转化成了小问题,因此简化了编码以及 ...

  5. 从分治算法到 MapReduce

    为什么80%的码农都做不了架构师?>>>    从分治算法说起 要说 MapReduce 就不得不说分治算法,而分治算法其实说白了,就是四个字 分而治之 .其实就是将一个复杂的问题分 ...

  6. 计算机基础算法棋盘覆盖,分治算法求解棋盘覆盖问题互动教学过程.doc

    分治算法求解棋盘覆盖问题互动教学过程 分治算法求解棋盘覆盖问题互动教学过程 摘要:针对算法设计与分析课程难度较大.对学生编程能力要求较高的现状,通过对棋盘覆盖问题的分治算法求解过程进行互动教学设计,引 ...

  7. 编程珠玑第八章——分治算法求解数组中的最大的连续和

    关键在于把数组分为两个部分a,b.最大的连续和要么在a要么在b,另外还有可能就是跨越a,b的边界,将跨越边界的最大向量称为mc. 一个注意的地方就是mc正在a中的部分包含右边边界的最大子向量,而mc在 ...

  8. python分治算法_python算法实现-分治法

    分治法概念将一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题----"分" 将最后子问题可以简单的直接求解----"治" 将所有子问 ...

  9. 分治算法求乘方a^b 取余p(divide and conquer)

    传统的计算方法为循环n个a相乘.时间复杂度为O(n). 如用分治算法,效率可提升至O(lgn). 结合recursive有 double pow(int a, int n){if(n==0)retur ...

  10. 斐波那契数列取模(大数)分治算法

    斐波那契数列取模(大数)分治算法 这是算法课程上完分之策略后老师留的一道题目: 菲波那契数列如下:1,1,2,3,5,8,13,21,34......其中a[1] = 1, a[2] = 1, a[n ...

最新文章

  1. 并发编程-04线程安全性之原子性Atomic包的4种类型详解
  2. 配置无密码登录linux,linux ssh无密码登录配置
  3. html排序图标,css实现排序升降图标
  4. LDA的Gibbs抽样详细推理与理解
  5. 【华为云技术分享】Nginx应用调优案例
  6. 下列有关计算机图形的叙述中错误的是,计算机图形学(9-16)-中国大学mooc-题库零氪...
  7. oracle异步sql,Linux上Oracle是否使用异步io的诊断
  8. 正则表达式 —— 括号与特殊字符
  9. 链接器工具错误 LNK2026 XXX模块对于 SAFESEH 映像是不安全的
  10. 初识数据库——Mysql入门
  11. maven添加ojdbc6.jar包
  12. 海康服务器协议,国标流媒体服务器GB28181协议和海康设备的交互过程记录
  13. 如何卸载快压病毒流氓软件--不停自动下载安装App
  14. Internal Server Error, Malformed UTF-8 characters, possibly incorrectly encoded
  15. ios html转换成网页,ios App加载本地HTML网页,点击网页链接跳转到app页面的方法
  16. 【网络安全】文件上传漏洞 详解
  17. 数据库管理系统MySQL(一)
  18. 任正非一语中的,未来科技的发展核心靠他们!
  19. 【联邦学习】联邦学习量化——non-iid数据集下的仿真
  20. Java web 服务器配置

热门文章

  1. 遇到不会打的字怎么办?
  2. Movicon/Connext设备连接实例(一)——Movicon.NExT与Codesys通讯
  3. 预测性编码(Predictive Coding)简介
  4. 数字孪生城市建设标准体系
  5. c语言 字符串字符反向储存_反向字符串的PL / SQL程序
  6. 如何培养新人总结_如何将一名新员工快速带入新岗位?
  7. Java实现deflate算法的压缩和解压
  8. Win10清除cmd运行历史记录
  9. webservice 实现与his系统对接_多平台订单管理系统:传统企业实现无缝对接多渠道资源...
  10. linux gadget 模拟鼠标,HID设备--开发板模拟鼠标