NO.68十六届蓝桥杯备战|基础算法-离散化|火烧赤壁|贴海报(C++)

当题⽬中数据的范围很⼤,但是数据的总量不是很⼤。此时如果需要⽤数据的值来映射数组的下标时,就可以⽤离散化的思想先预处理⼀下所有的数据,使得每⼀个数据都映射成⼀个较⼩的值。之后再⽤离散化之后的数去处理问题。
⽐如:[99, 9, 9999, 999999]离散之后就变成[2, 1, 3, 4]

【离散化模板⼀】排序+去重+⼆分离散化之后的值

// 离散化模板⼀:排序 + 去重 + ⼆分查找离散之后的结果  
#include <iostream>  
#include <algorithm>  
using namespace std;  

const int N = 1e5 + 10;  

int n;  
int a[N];  
int pos; // 标记去重之后的元素个数
int disc[N]; // 帮助离散化  

// ⼆分 x 的位置  
int find(int x)  
{  
	int l = 1, r = pos;  
	while(l < r)  
	{  
		int mid = (l + r) / 2;  
		if(disc[mid] >= x) r = mid;  
		else l = mid + 1;  
	}  
	return l;  
}  

int main()  
{  
	cin >> n;  
	for(int i = 1; i <= n; i++)  
	{  
		cin >> a[i];  
		disc[++pos] = a[i];  
	}  
	// 离散化  
	sort(disc + 1, disc + 1 + pos); // 排序  
	pos = unique(disc + 1, disc + 1 + pos) - (disc + 1); // 去重  
	
	for(int i = 1; i <= n; i++)  
	{  
		cout << a[i] << "离散化之后:" << find(a[i]) <
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值