mirror of
https://github.com/huihut/interview.git
synced 2024-03-22 13:10:48 +08:00
117 lines
2.6 KiB
C++
117 lines
2.6 KiB
C++
|
#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;
|
|||
|
}
|