描述

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

输入

第1行是一个整数n,表示油井的数量(1≤n≤10 000)。
接下来n行是油井的位置,每行两个整数x和y
(﹣10 000≤x,y≤10 000)。

输出

各油井到主管道之间的输油管道最小长度总和。

输入输出样例

输入样例

5
1 2
2 2
1 3
3 -2
3 3

输出样例

6

分析

设n口油井的位置分别为 Pi=(xi,yi),i=1~n。由于主输油管道是东西向的,因此可用其主轴线的y坐标唯一确定其位置。主管道的最优位置y应该满足:

由中位数定理可知,y是中位数。

代码

方法一:对数组a排序(一般是升序),取中间的元素

#include<bits/stdc++.h>
using namespace std;int main()
{int n;                 //油井的数量int x;                   //x坐标,读取后丢弃int a[1000];              //y坐标cin>>n;for(int k=0; k<n; k++)cin>>x>>a[k];sort(a,a+n);                //按升序排序
//计算各油井到主管道之间的输油管道最小长度总和int min=0;for(int i=0; i<n; i++)min += (int)fabs(a[i]-a[n/2]);cout<<min<<endl;}

方法二:采用分治策略求中位数

#include <iostream>
#include <cmath>
using namespace std;#define NUM 1001
int a[NUM];
int select(int left, int right, int k)
{if (left >= right)return a[left];int i = left;int j = right+1;int pivot = a[left];while (true){do{i = i+1;}while (a[i] < pivot);do{j = j-1;}while (a[j] > pivot);if (i >= j)break;swap(a[i], a[j]);}if (j-left+1 == k)return pivot;a[left] = a[j];a[j] = pivot;if (j-left+1 < k)return select(j+1, right, k-j+left-1);elsereturn select(left, j-1, k);
}int main()
{int n;int x;int y;cin>>n;for (int i=0; i<n; i++)cin>>x>>a[i];y = select(0, n-1, n/2);int min=0;for(int i=0; i<n; i++)min += (int)fabs(a[i]-y);cout<<min<<endl;return 0;
}

【算法】输油管道问题相关推荐

  1. 输油管道问题(分治算法)

    让我们来看一条算法问题: 题目描述:某石油公司计划建造一条由东向西的主输油管道.该管道要穿过一个有n 口油井的油田.从每口油井都要有一条输油管道沿最短路经(或南或北)与主管道相连.如果给定n 口油井的 ...

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

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

  3. 问题 N: 算法设计与分析 输油管道

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

  4. 算法与数据结构重点归纳

    1.算法 for(i=n-1; i>=1; i–) for(j=1; j<=i; j++) if(A[j]>A[j+1]) A[j]与A[j+1]对换: 其中n为正整数,则最后一行语 ...

  5. Vijos P1691 输油管道问题【中位数+排序】

    背景 想念car的GF,car就出了道水题! 描述 某石油公司计划建造一条由东向西的主输油管道.该管道要穿过一个有n 口油井的油田.从每口油井都要有一条输油管道沿最短路经(或南或北)与主管道相连.如果 ...

  6. 【算法设计与分析】经典常考三十三道例题AC代码

    ❥小虾目前大三,我校在大一下开设<数据结构>这门课,大二上开了<算法设计与分析>这门课,很庆幸这两门课的上机考试总成绩一门100,一门99,最后总分也都90+.下文会给出机试的 ...

  7. 算法设计与分析: 2-7 士兵站队问题

    2-7 士兵站队问题 问题描述 在一个划分成网格的操场上,n个士兵散乱地站在网格点上.网格点由整数坐标(x,y)表示.士兵们可以沿网格边上.下.左.右移动一步,但在同一时刻任一网格点上只能有一名士兵. ...

  8. 华中农业大学算法实验课答案

    华中农业大学算法实验课答案 贪心 最优分解问题: 会场安排问题 最小硬币数目问题 硬币找钱问题 汽车加油问题 程序存储问题 动态规划 最大连续子段和 最短下降路径问题: 最少硬币问题: 最长公共子序列 ...

  9. 算法复习——分治法重点问题

    一.众数问题 问题描述:给定含有n 个元素的多重集合S,每个元素在S 中出现的次数称为该元素的重数.多重集S 中重数最大的元素称为众数.例如,S={1,2,2,2,3,5}.多重集S 的众数是2,其重 ...

最新文章

  1. UnicodeEncodeError: 'ascii' codec can't encode character....
  2. Caffe学习系列(13):数据可视化环境(python接口)配置
  3. Rule-Guided Compositional Representation Learning on Knowledge Graphs-学习笔记
  4. 【渝粤教育】国家开放大学2018年春季 7402-21T社会问题 参考试题
  5. Docker 制作镜像的方式
  6. UpdateData()函数使用
  7. 纯JavaScript实现鼠标拖尾效果
  8. Java 转换成ObjectC代码
  9. Selenium调用使用360浏览器,QQ浏览器,遨游浏览器,猎豹浏览器,Chromium
  10. php实现ipv4转换ipv6
  11. windows照片查看器没了_Windows电脑中实用性特别强的9款软件,建议大家低调收藏!...
  12. c#程序员和java薪酬_语言趋势和薪水:Java的未来之路
  13. Pointnet网络结构与代码解读
  14. 凯利公式(庄家必胜篇)——致放假在家的高薪程序员们
  15. 商业研究(10):比呀比-海淘电商-海外正品直邮-高品质跨境购物平台
  16. FFmpeg解封装通用代码
  17. 【高效办公】五、windows通过SSH连接另一台电脑虚拟机中的ubuntu详细教程
  18. JsDelivr CDN缓存刷新工具-缓存清除-缓存更新
  19. Chapter(MySQL)(基础知识)
  20. Selenium UI自动化验证码:识别+输入

热门文章

  1. stm32的rxne和idle中断_stm32 USART_IT_IDLE中断 一帧数据
  2. 转:多巴胺导致过程大于结果
  3. 国内真正永久免费的OA办公系统
  4. 结合openCV学习DIP之传统图像特征与匹配
  5. 计算机 和金融主要学什么,计算机和金融哪个更好?未来发展有什么区别?
  6. 智能家居和建筑行业调研报告 - 市场现状分析与发展前景预测
  7. 【开发指南】AR Foundation 开发环境部署
  8. tensorflow-读数据(1)
  9. 关于报错: output or inout port “seven_tube_sel_n“must be connected to a structural net expression
  10. DRL for Online Computation Offloading in Wireless Powered Mobile-Edge Computing Networks