cpp-interview/Problems/TubingProblem/Tubing.cpp
2018-02-11 01:08:43 +08:00

117 lines
2.6 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include <iostream>
using namespace std;
// 油井y坐标指针
float * y = NULL;
// 快速排序
void quick_sort(int low, int high)
{
if (low >= high) // 结束标志
return;
int first = low; // 低位下标
int last = high; // 高位下标
float key = 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);
}
int main()
{
int n; // 油井数
float mid; // y数组的中间位置的数
float minDistance = 0; // 各油井到主管道之间的管道长度总和最小位置
cout << "---------------- 输油管问题 ----------------" << endl;
cout << "请输入油井数 n (n>=0) " << endl;
// 输入油井数
cin >> n;
// 判断输入数据合法性包括检查输入是否为数字k值是否大于0
if (cin.fail() || n < 0)
{
cout << "输入n错误" << endl;
system("pause");
return 0;
}
// 分配n个y坐标存储空间
y = new float[n];
cout << "请输入 " << n << " 个油井的 y 坐标(用空格隔开)" << endl;
// 输入油井的 y 坐标
for (auto i = 0; i < n; i++)
{
cin >> y[i];
}
// 判断输入数据合法性
if (cin.fail())
{
cout << "输入y坐标错误" << endl;
system("pause");
return 0;
}
// 运用快速排序对y坐标数组进行排序
quick_sort(0, n - 1);
// 计算y数组的中间位置的数
mid = y[n / 2];
// 计算各个油井到主输油管的长度之和
for (auto i = 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;
return 0;
}