C++离散化排序问题,无法AC,求指教!
【题目描述】
输入n,再输入n行,每行2个关键字,按照第一关键字排序,保证所有的第一关键字都不一样
n <= 1000
每个数字在int范围内
【输入样例】
5
1 10
200 1
123 10
4 10
3 23
【输出样例】
1 10
3 23
4 10
123 10
200 1
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
int n;
cin >> n;
vector<pair<int, int>> items;
for (int i = 0; i < n; i++) {
int k1, k2;
cin >> k1 >> k2;
items.push_back({k1, k2});
}
sort(items.begin(), items.end(), greater<pair<int, int>>());
vector<pair<int, int>> sortedItems;
for (auto item : items) {
sortedItems.push_back(item);
}
reverse(sortedItems.begin(), sortedItems.end());
for (auto item : sortedItems) {
cout << item.first << " " << item.second << endl;
}
return 0;
}
对于C++离散化排序问题,我可以提供以下解决方案:
输入:
3
4 1
3 2
1 3
输出:
1 3
3 2
4 1
离散化排序问题可以使用桶排序的思路来解决。具体步骤如下:
(1) 输入n个数据,每个数据包含两个关键字。
(2) 取出每个数据的第一关键字,把所有第一关键字从小到大进行排序,排序后的下标即为该数据的离散化后的下标。
(3) 根据离散化后的下标把数据存入桶中,同一离散化下标的数据存入同一个桶中。
(4) 按照桶的顺序把数据拿出来,输出即可。
以下是C++离散化排序问题的完整代码实现:
using namespace std;
struct Data { int key1, key2, index; bool operator<(const Data &a) const { return key1 < a.key1; } };
bool compareByKey2(const Data &a, const Data &b) { return a.key2 < b.key2; }
int main(){ int n; cin >> n; vector data(n); for (int i = 0; i < n; i++){ cin >> data[i].key1 >> data[i].key2; data[i].index = i; } sort(data.begin(), data.end()); vector> bucket(n); for (int i = 0; i < n; i++){ bucket[data[i].key1].push_back(data[i]); } for (int i = 0; i < n; i++){ sort(bucket[i].begin(), bucket[i].end(), compareByKey2); } for (int i = 0; i < n; i++){ for (int j = 0; j < bucket[i].size(); j++){ cout << bucket[i][j].key1 << " " << bucket[i][j].key2 << endl; } } return 0; }
(1) 对于数据的排序,需要重载运算符<,根据第一关键字来实现排序。
(2) 对于桶中数据的排序,需要重新定义比较函数,根据第二关键字来实现排序。
(3) 桶的下标即为离散化后的下标,需要注意每个桶可能存放多个数据。
(4) 结构体中需要记录数据的原始下标,可以在输出时根据原始下标输出。
(1) C++离散化排序问题的详细解释:https://cloud.tencent.com/developer/article/1634797
(2) C++结构体的使用:https://www.runoob.com/cplusplus/cpp-structures.html
(3) C++向量(vector)的使用:https://www.runoob.com/w3cnote/cpp-vector-container-analysis.html