离散化学习笔记
处理重复值的离散方法
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+5;
int a[maxn],t[maxn];
int main()
{
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
t[i]=a[i];
}
sort(t+1,t+1+n);
int len=unique(t+1,t+1+n)-t-1;
for(int i=1;i<=n;i++)
{
a[i]=lower_bound(t+1,t+1+len,a[i])-t;
}
for(int i=1;i<=n;i++)cout<<a[i]<<" ";
cout<<endl;
return 0;
}
不能处理重复问题但是效率更高的算法
用结构体记录值以及原来对应的位置,将其排序后对最小的结构体值对应的位置赋予相对的大小
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+5;
struct hp
{
int id,val;
}a[maxn];
int rk[maxn];
bool cmp(hp a,hp b)
{
return a.val<b.val;
}
int main()
{
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i].val);
a[i].id=i;
}
sort(a+1,a+1+n,cmp);
for(int i=1;i<=n;i++)
{
rk[a[i].id]=i;
}
for(int i=1;i<=n;i++)
{
cout<<rk[i]<<" ";
}
cout<<endl;
return 0;
}

浙公网安备 33010602011771号