C++经典算法问题:输油管道问题丨排序算法实战
Posted 一起学编程
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++经典算法问题:输油管道问题丨排序算法实战相关的知识,希望对你有一定的参考价值。
问题说明
某石油公司计划建造一条由东向西的主输油管道。 该管道要穿过一个有n 口油井的油田。 从每口油井都要有一条输油管道沿最短路经(或南或北)与主管道相连。 如果给定n口油井的位置,即它们的x 坐标(东西向)和y 坐标(南北向), 应如何确定主管道的最优位置, 即使各油井到主管道之间的输油管道长度总和最小的位置?
功能说明
本程序用排序求中值的方法求解输油管道问题。
代码简述
通过用户输入数据(只输入油井数n、每个油井的y坐标), 程序输入检测,动态分配空间,排序(使用快速排序), 求出中间值,输出。
输出有以下两种情况:
(1)当n为奇数,则最优位置为y数组的第n/2个油井的y坐标
(2)当n为偶数,则最优位置为y数组的中间两个油井的y坐标的区间
代码示例
#include<iostream>
usingnamespacestd;
//油井y坐标指针
float* y =NULL;
//快速排序
voidquick_sort(intlow,inthigh)
{
if(low >= high)//结束标志
return;
intfirst = low;//低位下标
intlast = high;//高位下标
floatkey = y[first];//设第一个为基准
while(first < last)
{
//将比第一个小的移到前面
while(first < last && y[last] >= key)
last--;
if(first < last)
y[first++] = y[last];
//将比第一个大的移到后面
while(first < last && y[first] <= key)
first++;
if(first < last)
y[last--] = y[first];
}
//基准置位
y[first] = key;
//前半递归
quick_sort(low, first -1);
//后半递归
quick_sort(first +1, high);
}
intmain()
{
intn;//油井数
floatmid;//y数组的中间位置的数
floatminDistance =0;//各油井到主管道之间的管道长度总和最小位置
cout <<"---------------- 输油管问题 ----------------"<< endl;
cout <<"请输入油井数 n (n>=0)"<< endl;
//输入油井数
cin >> n;
//判断输入数据合法性,包括检查输入是否为数字,k值是否大于0
if(cin.fail() || n <0)
{
cout <<"输入n错误!"<< endl;
system("pause");
return0;
}
//分配n个y坐标存储空间
y =newfloat[n];
cout <<"请输入"<< n <<"个油井的 y 坐标(用空格隔开)"<< endl;
//输入油井的 y 坐标
for(autoi =0; i < n; i++)
{
cin >> y[i];
}
//判断输入数据合法性
if(cin.fail())
{
cout <<"输入y坐标错误!"<< endl;
system("pause");
return0;
}
//运用快速排序对y坐标数组进行排序
quick_sort(0, n -1);
//计算y数组的中间位置的数
mid = y[n /2];
//计算各个油井到主输油管的长度之和
for(autoi =0; i < n; i++)
{
minDistance +=abs(y[i] - mid);
}
//显示输出
cout <<"------------------------------------------------"<< endl;
//判断油井奇偶,做不同的输出
if(n &1)
{
//n为奇数,则最优位置为y数组的第n/2个油井的y坐标
cout <<"主管道的最优位置为:y ="<< mid << endl;
}
else
{
//n为偶数,则最优位置为y数组的中间两个油井的y坐标的区间
cout <<"主管道的最优位置为:y = ["<< y[n /2-1] <<","<< mid <<"]"<< endl;
}
//输出各油井到主管道之间的管道总长度
cout <<"各油井到主管道之间的管道总长度为:"<< minDistance << endl;
cout <<"------------------------------------------------"<< endl;
//暂停查看结果
system("pause");
//释放内存
delete[]y;
//指针置空
y =NULL;
return0;
}
今天的分享就到这里了,大家要好好学C++哟~
写在最后:对于准备学习C/C++编程的小伙伴,如果你想更好的提升你的编程核心能力(内功)不妨从现在开始!
C语言C++编程学习交流圈子,QQ群:904329806【点击进入】微信公众号:C语言编程学习基地
整理分享(多年学习的源码、项目实战视频、项目笔记,基础入门教程)
欢迎转行和学习编程的伙伴,利用更多的资料学习成长比自己琢磨更快哦!
编程学习视频分享:
以上是关于C++经典算法问题:输油管道问题丨排序算法实战的主要内容,如果未能解决你的问题,请参考以下文章