输入
第1行:一个整数N,范围在[1…10000]。
第2行:有N个整数,每个数都是int范围的。注意:可能有相同整数。
第2行:有N个整数,每个数都是int范围的。注意:可能有相同整数。
输出
依次输出每个数的排名。
样例输入
5 8 2 6 9 2
样例输出
3 1 2 4 1
数据范围限制
1<=N<=10000
#include <stdio.h>
#include <string.h>
int a[10005],b[10005];
int main()
{
int n;
scanf("%d",&n);
for (int i = 0;i<n;i++)
{
scanf("%d",&a[i]);
b[a[i]]++;
}
int index = 1;
for (int i = 0;i<10005;i++)
{
if (b[i] != 0)
{
b[i] = index++;
}
}
for (int i = 0;i<n;i++)
{
printf("%d ",b[a[i]]);
}
}
二解:
#include<bits/stdc++.h>
using namespace std;
struct node
{
int num,id_before,id_after;
} a[10002];
int n;
int cmp1(node A,node B)
{
return A.num<B.num;
}
int cmp2(node A,node B)
{
return A.id_before<B.id_before;
}
int main()
{
cin>>n;
for(int i=0;i<n;i++)
{
cin>>a[i].num;
a[i].id_before=i+1; //之前编号初始化
}
sort(a,a+n,cmp1); //对数据进行排序
a[0].id_after=1; //之后编号初始化
int h=1;
for(int i=1;i<n;i++)
{
if(a[i].num>a[i-1].num)
a[i].id_after=++h;
else
a[i].id_after=h;
}
sort(a,a+n,cmp2);
for(int i=0;i<n;i++)
cout<<a[i].id_after<<" ";
return 0;
}