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

这篇具有很好参考价值的文章主要介绍了C++:分治算法之输油管道问题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

描述

输入

输出

输入样例

输出样例

分析

代码

运行结果


描述

¢ 某石油公司计划建造一条 由东向西 的主输油管道。该管道要穿过一个有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

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

分析

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

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

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

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

代码

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

算法1数组a排序(一般是升序),取中间的元素

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<algorithm>
using namespace std;

int main() {
	int n;//油井数量
	int x;//横坐标
	int a[1000];//纵坐标

	cin >> n;

	for (int i = 0; i < n; i++) {
		cin >> x >> a[i];//输入每个油井的坐标
	}
	sort(a, a + n);//n个油井的y轴按大小升序排列(a-》0,a+n-》a[n])

	//计算各油井到主管道之间的输油管道最小长度总和
	int min=0;//初始化最小长度
	for (int k = 0; k < n; k++) {
		min += (int)fabs(a[k] - a[k / 2]);
	}
	cout << "各油井到主管道之间的输油管道最小长度总和为:";
	cout << min << endl;

	return 0;
}

运行结果

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

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

算法2采用分治策略求中位数文章来源地址https://www.toymoban.com/news/detail-432635.html

int n;					//油井的数量
int x;					//x坐标,读取后丢弃
int a[1000];				//y坐标
cin>>n;
for (int i=0; i<n; i++)
	cin>>x>>a[i];
int 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;

/*
* 输油管问题--分治算法计算中位数
*/

#include<iostream>
#include<algorithm>
using namespace std;

const int  NUM=1001;
int a[NUM];

//在a[left:right]中选择第k小的元素
int select(int left,int right,int k) {
	if (left >= right)
		return a[left];
	int low = left;//从左到右的指针
	int hight = right+1;//从右到左的指针

	//把最左边的元素作为分界数据
	int pivot = a[left];

	//把左侧>=pivot的和右侧<=pivot的元素交换
	while (true) {

		//在左侧找出>=pivot的元素
		do {
			low= low+1;
		} while (a[low]<pivot);

		//在右侧找出<=pivot的元素
		do {
			hight= hight-1;
		} while (a[hight]>pivot);
		if (low > hight)
			break;
		swap(a[low], a[hight]);
	}
	if ((hight - left + 1 )== k)
		return pivot;

	a[left] = a[hight];
	a[hight] = pivot;//存储pivot

	if ((hight - left + 1 )< k)
		//对一个段进行递归调用
		return select(hight + 1, right, k-hight+left-1);
	else
		return select(left, hight - 1, k);
}

int main() {
	int n;//油井数量
	int x;//横坐标
	int a[1000];//纵坐标

	cin >> n;

	for (int i = 0; i < n; i++) {
		cin >> x >> a[i];//输入每个油井的坐标
	}
	int 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;
}

到了这里,关于C++:分治算法之输油管道问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【算法设计与分析】分治法(最近点对问题)

    目录 实验目的 实验内容与结果 蛮力法求解 分治法求解 实验总结 (1)掌握分治法思想。 (2)学会最近点对问题求解方法。 算法过程: 遍历n个点与剩余n-1个点之间的距离,在计算点对距离时不断更新最短距离的值,遍历完所有点对后即可求得最短点对距离。 伪代码: 复

    2024年02月08日
    浏览(48)
  • 分治法解二维的最近对问题,算法分析与代码实现,蛮力法与分治法解决二维的最近对问题的区别

    🎊【数据结构与算法】专题正在持续更新中,各种数据结构的创建原理与运用✨,经典算法的解析✨都在这儿,欢迎大家前往订阅本专题,获取更多详细信息哦🎏🎏🎏 🪔本系列专栏 -  数据结构与算法_勾栏听曲_0 🍻欢迎大家  🏹  点赞👍  评论📨  收藏⭐️ 📌个人主

    2024年02月04日
    浏览(43)
  • 分治与减治算法实验:题目6 淘汰赛冠军问题

    目录 前言 实验内容 实验流程 实验分析 实验过程 流程演示 写出伪代码 实验代码 运行结果 改进算法 总结 淘汰赛冠军问题是一个经典的算法设计与分析的问题,它要求我们在给定的n个参赛者中,通过一系列的比赛,找出最终的冠军。这个问题可以用分治策略来解决,即将

    2024年02月06日
    浏览(182)
  • 算法:分治思想处理快排递归以及快速选择/最小K个数问题

    分治的原理就是分而治之,从原理上讲,就是把一个复杂的问题划分成子问题,再将子问题继续划分,直到可以解决 基于分治的原理进行快速排序,区别于传统的快速排序,这里对快速排序进行改良,成为更优先的三路划分算法,可以处理一些极端场景,使快速排序的适用性

    2024年02月10日
    浏览(55)
  • 数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。

    最短路径的算法有两个, Dijkstra算法 和 Floyd算法 。 Dijkstra算法 解决的是 单源 最短路径问题 。 Floyd算法解决的是 多源 最短路径问题,并且可以处理负权图 。 今天要讲的就是Dijkstra算法。 加: feng--Insist (大写的i),进java交流群讨论互联网+技术。可索要PPT等资料。 其他资料

    2024年02月11日
    浏览(58)
  • 数据结构学习记录——图应用实例-拯救007(问题描述、解题思路、伪代码解读、C语言算法实现)

    目录 问题描述  解题思路 伪代码  总体算法 DFS算法 伪代码解读 总体算法 DFS算法 具体实现(C语言) 在老电影“007之生死关头”(Live and Let Die)中有一个情节,007被毒贩抓到一个鳄鱼池中心的小岛上,他用了一种极为大胆的方法逃脱 —— 直接踩着池子里一系列鳄鱼的大脑

    2024年02月05日
    浏览(78)
  • 简单描述下微信小程序的目录结构

    微信小程序的目录结构通常包括以下主要部分: 这是一个典型的微信小程序的目录结构,具体项目可能会有一些变化,但通常都包含类似的核心文件和文件夹。小程序开发者需要按照这个结构组织项目代码和资源 app.js :小程序的主入口文件,用于定义小程序的全局配置,包

    2024年02月07日
    浏览(44)
  • 算法-分治算法

    文章来源: https://blog.csdn.net/weixin_45630258/article/details/126425400 欢迎各位大佬指点、三连 1、定义:分治,也就是分而治之。 它的一般步骤是: ① 将原问题分解成若干个规模较小的子问题(子问题和原问题的结构一样,只是规模不一样) ② 子问题又不断分解成规模更小的子问

    2024年02月09日
    浏览(36)
  • 算法基础15 —— 分治算法(归并排序 + 快速排序)

    分治法的基本概念、思想 分治法是一种很重要的算法。 字面解释,分治分治,分而治之。就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。 不难发现,分

    2024年02月03日
    浏览(53)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包