這是一個非常簡單的離散化模板題,沒有任何難度。之所以寫這個題解,是爲了加深對離散化的理解。
題目
題目鏈接
我的OJ,http://47.110.135.197/problem.php?id=5238。
題目描述
現有數列 A1, A2, ⋯, An,數列中可能有重複元素。
現在要求輸出該數列的離散化數列,重複元素離散化後的數字不同。
輸入
第一行,一個整數 n。
第二行,n 個整數整數 A1, A2, ⋯, An。
輸出
一行,包括 n 整數。表示數列對應的離散化數列,重複元素離散化後的數字不同。
樣例輸入
6
1 23424 242 65466 242 0
樣例輸出
1 4 2 5 3 0
數據範圍
對於 50% 的數據,1 ≤ N ≤ 10^3。
對於 100% 的數據,1 ≤ N ≤ 10^5 , -10^9 ≤ Ai ≤ 10^9。
分析
由於相同的元素離散化後數字不同,所以需要記錄原有數據索引,然後在遍歷真個排序後數據,進行離散化
樣例分析
原始數據爲:
data: 1 23424 242 65466 242 0
index:0 1 2 3 4 5
排序後數據變爲:
data: 0 1 242 242 23424 65466
index: 5 0 2 4 1 3
最後通過逐一遍歷排序後的數據,得到數據離散化索引。比如原始數據 23424,爲第 4 大數據,所以離散化後的值爲 4;原始數據第一個 242,爲第 2 大數據,所以離散化後的值爲 2。這樣對應的離散化後數據爲:
1 4 2 5 3 0
思路
1、讀入數據。
2、排序。
3、遍歷數組建立離散化對應的索引。
如樣例數據分析可以知道,我們需要保存原數據的索引。因此我們可以定義一個結構體來實現。
AC 參考代碼
#include <bits/stdc++.h>
using namespace std;
struct NODE {
int data;//數據
int id;//索引
};
const int MAXN = 1e5+4;
NODE num[MAXN] = {};//保存原始數據
int lsh[MAXN] = {};//離散化後數據
bool mycmp(const NODE &x, const NODE &y) {
return x.data < y.data;
}
int main() {
//讀入數據
int n;
scanf("%d", &n);
int i;
for (i=0; i<n; i++) {
scanf("%d", &num[i].data);
num[i].id=i;//建立索引
}
//排序
sort(num, num+n, mycmp);
//遍歷建立離散化索引
for (i=0; i<n; i++) {
lsh[num[i].id] = i;
}
//打印輸出
for (i=0; i<n; i++) {
printf("%d ", lsh[i]);
}
printf("\n");
return 0;
}