题目描述
存储阵列上使用的一批固态硬盘,根据硬盘磨损值给定一个数组 endurances
,数组中每个元素表示单块硬盘的磨损度(0 到 10000 之间)。磨损度越大,表示此盘需要更换的概率越高。需要找出磨损度最高三块盘的下标和磨损度最低三块盘的下标。
输入:
- 输入为一组硬盘磨损度的数组。
输出:
- 第一行:磨损度最高三块盘的下标,按下标升序展示。
- 第二行:磨损度最低三块盘的下标,按下标升序展示。
输入说明:
- 数组
endurances
中无重复值。 - 数组的长度范围:
[6, 200]
。 - 数组的下标从 0 开始。
输出说明:
- 输出两行结果,第一行是磨损度最高三块硬盘的下标,第二行是磨损度最低三块硬盘的下标,且下标按升序排列。
用例输入
1 50 40 68 72 86 35 14 87 99 63 75
5 8 9
0 6 7
23 34 56 12 11 10
0 1 2
3 4 5
解题思路
-
输入解析:
- 先读取硬盘的磨损度数组
endurances
。 - 同时构建一个数组,将硬盘的下标和磨损度一起存储,以便后续排序操作。
- 先读取硬盘的磨损度数组
-
排序并提取最大和最小值的下标:
- 提取出磨损度最低的前三个元素的下标。
- 提取出磨损度最高的后三个元素的下标。
-
排序下标:
- 对最小和最大值的下标进行升序排序,确保输出按升序排列。
代码
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;int main() {vector<pair<int, int>> data;int val;int idx = 0;while (cin >> val) {data.push_back({ idx, val });idx++;if (cin.get() == '\n') break; // 遇到换行符结束输入}// 按磨损度升序sort(data.begin(), data.end(),[](const pair<int, int>& a, const pair<int, int>& b) {return a.second < b.second;});// 取出最低三块硬盘下标vector<int> min_index;for (int i = 0; i < 3; ++i) {min_index.push_back(data[i].first);}// 取出最高三块硬盘下标vector<int> max_index;for (int i = data.size() - 3; i < data.size(); ++i) {max_index.push_back(data[i].first);}// 排序输出最低三块硬盘下标sort(min_index.begin(), min_index.end());sort(max_index.begin(), max_index.end());for (int i = 0; i < 3; ++i) {cout << max_index[i] << " ";}cout << endl;for (int i = 0; i < 3; ++i) {cout << min_index[i] << " ";}cout << endl;return 0;
}