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

算法设计的思想:

1.问题实际上可以转化成一维问题,即油井到管道的距离只喝纵坐标有关,故可以将对象抽象到一条y方向的数轴上面。
2.已知,如果是两个井,则管道穿过二者中间;如果是三个井,则管道穿过最中间的一个点。归纳一下即为,管道的纵坐标应该是所有油井的纵坐标的中位数。
问题转化为求,n个数的中位数.。

求中位数的分治思想:

1.如果这组数是有序的,那么这个数组的中位数就是a[n/2];直接用排序中用到分治法的冒泡排序进行排序,但是这样一方面时间复杂度nlogn较高,一方面我们并不想排序,多做了无用的步骤,算法效率不高.
2.线性时间复杂度下的选择算法。实际上还是利用快速排序,进行选择。代码如下.

#include<stdlib.h>//绝对值函数
#include<stdio.h>
#define N 10000
void Swap(int &a,int &b)
{int t=a;a=b;b=t;
}int Partion (int a[],int l,int h)//a数组,l表示下限,h表示上限
{int x=a[l];//将小于x的元素交换到左边区域,将大于x的元素交换的右边区域while(l<h){while(l<h&&a[h]>=x) --h;Swap(a[l],a[h]);while(l<h&&a[l]<=x) ++l;Swap(a[l],a[h]);}a[l]=x;return l;//返回数轴的位置
}int Select(int a[],int l,int h,int k)
{if(l==h) return a[l];int i=Partion(a,l,h);int j=i-l+1; //表示这个数轴是整个数组中第几小的.if(k<=j)//如果比第k小的数要大,则在比它小的数中中在找第k小的return Select(a,l,i,k);else//如果比第k小的数要大,则只需要在比它大的数中找,第k-j大的return Select(a,i+1,h,k-j);}
int main()
{int a[N],b[N];int n,mid,sum=0;scanf("%d",&n);for(int i=0; i<n; i++)scanf("%d %d",&b[i],&a[i]);mid=Select(a,0,n-1,n/2+1);printf("mid=%d\n",mid);for(int i=0; i<n; i++)sum+=abs(a[i]-mid);printf("%d",sum);return 0;
}

输入输出样例
5
1 2
2 2
1 3
3 -2
3 3
输出
mid=2
6

时间复杂度分析

平均时间复杂度为O(n)

输油管道问题-分治法求解相关推荐

  1. 分治法求解集合的众数及其重数

    1. 分治法 分治法解题过程主要分为分.治.合三个步骤",应用该方法的基本过程如下: (1) 将原问题分解为若干个规模较小的子问题 (2) 对这些子问题分别求解 (3) 对各个子问题的解进行 ...

  2. 算法设计与分析 实验二 分治法求解最近点对问题

    分治法求解最近点对问题 一.实验目的与要求 1.实验基本要求 2.实验亮点 二.实验内容与方法 三.实验步骤与过程 (一)一些准备工作 1.实验流程 2.数据生成与去除重复点 (二)暴力穷举法 1.算 ...

  3. 分治法 分治法求解递推式

    分治法 分治法基本就是下面的三步 分(divide):无法有效解决的划分更小的问题 治(conquer):递归求每一个子问题的解 合(combine):合并解得出原问题解 MergeSort:排列 1 ...

  4. 分治法求解大整数乘法

    算法导论课作业:分治法求解大整数乘法 – 学号:20204227058 求解思想 ​ 实现大整数乘法的方法有许多种,其中我们最简单的方法就是小学里面教的竖式算法,这种方法在计算过程中数AAA需要和数B ...

  5. 凸包问题 分治法求解

    问题介绍 给定平面上一些点的集合,找到一些点,使得这些点形成一个凸的包围,围住所有的点,如图 思路 采用分治法,将点集合一分为二,整体的凸包问题可以分为[求上半部分的凸包]+[求下半部分的凸包] 分策 ...

  6. 快包_分治法求解凸包问题

    凸包问题(分治法) 题目简述 P2742 [USACO5.1]圈奶牛Fencing the Cows   农夫约翰想要建造一个围栏用来围住他的奶牛,可是他资金匮乏.他建造的围栏必须包括他的奶牛喜欢吃草 ...

  7. java 循环赛问题,网球循环赛思路 - 分治法求解(无代码)

    分治法: 列出人数为的情况: K = 1 1 2 2 1 其中第一列是选手的序号,之后n列代表着选手的对手 K = 2 1 2 3 4 2 1 4 3 3 4 1 2 4 3 2 1 可以看出,k=4 ...

  8. 分治法求解最大子数组问题

    最大子数组问题求解 将数组A分成两部分,A[left...mid]和A[mid+1..right]两部分,求解最大子数组之和包含了三种可能的情况: 1.完全位于子数组A[left...mid]中,因此 ...

  9. 算法设计棋盘覆盖问题c语言,棋盘覆盖问题(用分治法求解)

    // 棋盘覆盖 #include #include int Board[8][8]={0};//定义棋盘并初始化棋盘 void ChessBoard(int tr,int tc,int dr,int ...

最新文章

  1. 【MongoDB学习之一】初始MongoDB
  2. Coolpad F61刷机解锁成功
  3. python代码实现插入排序
  4. linux安装jdk8_Skywalking系列博客1-安装单机版 Skywalking
  5. matlab函数每天进步一点点
  6. 程序员过关斩将--从每秒6000写请求谈起
  7. [认证授权] 2.OAuth2授权(续) amp;amp; JSON Web Token
  8. Java Pattern类和Matcher类的使用
  9. CrossOver 12 发布,Windows 模拟器
  10. express使用JWT和httpOnly cookie进行安全验证
  11. mysql 自定义函数入门_【转】MYSQL入门学习之十三:自定义函数的基本操作
  12. 【新手教程】从零搭建php动态网站
  13. 计算机审计学心得思考,计算机审计学习心得体会范文
  14. 【c语言】计算圆周率的近似值
  15. 2月书讯 | 这本书让无数读者盼了千万遍
  16. waterfall.js
  17. Express-get和post
  18. UCI机器学习数据库的Python API介绍
  19. 使用java搭建简单的ligerui环境
  20. 推荐系统--基于图的推荐算法

热门文章

  1. echarts 5.4 版本 map 地图下钻,显示南沙群岛缩略图,海南三沙市编辑隐藏
  2. go设置后端启动_名企实习项目 | 后端开发岗go微服务实战项目启动,大牛导师带你拿offer!...
  3. 雅思备考笔记—听力篇(地图题)
  4. MEmu Android Emulator
  5. Imail邮局不能收邮件的解决办法
  6. 今日科技联播:特斯拉回应苹果“疯狂挖人”,对方比我们有钱100倍
  7. 《深度强化学习》面试题汇总
  8. Jackson反序列化List
  9. php企业官网源码 响应式,基于ThinkPHP5框架开发的响应式企业官网PHP源码_PC端+WAP手机端自适应+TP企业官网建站系统...
  10. Cortex-M4 浮点数的存储 和 FPU(Floating Point Unit) 杂记