离散化学习笔记

处理重复值的离散方法

#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;
}

posted @ 2021-10-11 16:11  -白翎-windrise  阅读(42)  评论(0)    收藏  举报