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 }
复制代码

 

posted @   薛晓明c++算法  阅读(95)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示