c++算法之离散化例题

发布时间 2023-08-04 19:35:29作者: 薛晓明c++算法

离散化基础2

题目描述

给定 n 个元素的数列,将相同的数据离散化为一个数据(去重),即把 {4000,201,11,45,11}{4000,201,11,45,11} 离散化为 {4,3,1,2,1}{4,3,1,2,1}。

输入格式

第一行一个整数 (1≤m≤105)n(1n105),为元素的个数。

第二行 n 个用空格隔天的整数 a[i](−109≤a[i]≤109)ai(109ai109),为数列中的元素。

输出格式

一行若干个整数,为离散化的结果,用一个空格隔开。

样例 #1

样例输入 #1

5
4000 201 11 45 11

样例输出 #1

4 3 1 2 1
 1 #include<iostream>
 2 #include<algorithm>
 3 using namespace std;
 4 int a[101100],b[101100];
 5 int main(){
 6     int n;
 7     cin >> n;
 8     for(int i=1;i<=n;i++){
 9         cin >> a[i];//未排序 
10         b[i]=a[i];//副本 
11     }
12     sort(b+1,b+n+1);
13     int cnt=unique(b+1,b+n+1)-(b+1);
14     for(int i=1;i<=n;i++){
15         //二分查找函数:>=a[i]的地址,“a[i]-b”就可以返回编号 
16         a[i]=lower_bound(b+1,b+cnt+1,a[i])-b;
17         printf("%d ",a[i]);
18     } 
19     return 0;
20 }