题目描述
用一个数组表示一群正在排队的小学生,每个小学生用一对整数 H, K 来表示:H 表示这个小学生的身高,K 表示这个小学生前面应该有 K 个人的身高 >= 他。
写一个算法,对给出的一组小学生计算出符合描述的正确排序。
输入:
输入为一组整数,以空格分隔:
- 第 1 个数字表示小学生的数量 n;
- 从第 2 个数字起,后续的数字两两一组,分别代表每个小学生的 H 和 K 的值:H1K1H2K2 … HnKn
输出:
根据输入,按照题目要求对小学生进行排序,每个小学生对应的 H 和 K 值为一组,按组输出,数字间使用空格分隔。比如:H1K1H2K2 … HnKn
样例如下:
输入:
6 7 0 4 4 7 1 5 0 6 1 5 2
输出:
5 0 7 0 5 2 6 1 4 4 7 1
题解思路:
这个就写的不错,直接借鉴一下:
代码如下:
#include <bits/stdc++.h>
using namespace std;
typedef pair<int, int> PAIR;
bool cmp(const PAIR& a, const PAIR& b) {
if (a.first != b.first) {
return a.first > b.first;
}
else {
return a.second < b.second;
}
}
int main() {
vector<pair<int, int>> v;
int num;
while (cin >> num) {
int a, b;
while (num--) {
cin >> a >> b;
v.push_back(pair<int, int>(a, b));
}
sort(v.begin(), v.end(), cmp);
for (int i = 0; i < v.size(); ++i) {
int cur = i - v[i].second;
for (int j = 0, k = i; j < cur; ++j, --k) {
swap(v[k], v[k - 1]);
}
}
for (int i = 0; i < v.size(); ++i) {
if (i == 0) {
cout << v[i].first << ' ' << v[i].second;
}
else {
cout << ' ' << v[i].first << ' ' << v[i].second;
}
}
}
return 0;
}