C++离散化排序问题,学习了大家的,还是无法AC,求指教!
【题目描述】
输入n,再输入n行,每行2个关键字,按照第一关键字从小到大排序,当第一关键字一样的时候,按照第二关键字从小到大排序
n <= 1000
每个数字在int范围内
【输入样例】
3
1 2
2 2
1 1
【输出样例】
1 1
1 2
2 2
#include <iostream>
#include <algorithm>
#include <vector>
#include <map>
using namespace std;
int main() {
int n;
cin >> n;
vector<pair<int, int>> data(n);
for (int i = 0; i < n; i++) {
cin >> data[i].first >> data[i].second;
}
vector<int> keys(n);
map<int, int> key_map;
for (int i = 0; i < n; i++) {
keys[i] = data[i].first;
}
sort(keys.begin(), keys.end());
keys.erase(unique(keys.begin(), keys.end()), keys.end());
for (int i = 0; i < keys.size(); i++) {
key_map[keys[i]] = i;
}
for (int i = 0; i < n; i++) {
data[i].first = key_map[data[i].first];
}
sort(data.begin(), data.end());
for (int i = 0; i < n; i++) {
cout << keys[data[i].first] << " " << data[i].second << endl;
}
return 0;
}
我可以为您提供离散化排序的解决思路和代码模板,希望能帮到您。
离散化排序是指将一串离散的数值转换为连续的数值,例如将 {2, 4, 3} 转换为 {1, 3, 2},以便使用排序算法进行排序。主要通过将原始数据映射到新的数据进行排序,最后再将新的数据转化到原始数据。
下面是C++的离散化排序实现代码及注释:
#include <bits/stdc++.h>
using namespace std;
const int maxn = 10010;
int n, m, a[maxn], b[maxn];
int find_x(int x) {
int l = 1, r = m, mid;
while (l <= r) { // 二分查找
mid = (l + r) / 2;
if (b[mid] == x)
return mid;
else if (b[mid] > x)
r = mid - 1;
else l = mid + 1;
}
return 0; // 找不到返回0
}
int main() {
scanf("%d", &n);
for (int i = 1; i <= n; i++) {
scanf("%d", &a[i]);
b[i] = a[i]; // 将a[i]存入b[i]中
}
sort(b + 1, b + n + 1); // 对b进行排序
m = unique(b + 1, b + n + 1) - b - 1; // 用unique函数去重,算出新数组长度m
for (int i = 1; i <= n; i++)
a[i] = find_x(a[i]); // 在b中查找a[i]对应的下标
for (int i = 1; i <= n; i++)
cout << a[i] << " "; // 输出离散化后的结果
return 0;
}
当输入 {2, 4, 3} 时,输出 {1, 3, 2}。
希望以上代码模板能对您有所帮助,如果仍有疑问,欢迎继续追问。