思路:
这道题看起来很复杂,但是却是有规律的,就拿样例来说吧,输入的第一个数是2,那么就说明后面只有2个数比它小,那么肯定就是3了,然后在原来的数组中把3标记去掉,然后第二个是0,那么后面都比它大,那么肯定就是1了,第三个是1,那么后面有1个数比现在的这个数小,那么就取的是4,然后依此类推。
代码:
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
using namespace std;
int main()
{
int n,i,j,k;
int a[1111],b[1111];
while(~scanf("%d", &n)) {
memset(a, 0, sizeof(a));
memset(b, 0, sizeof(b));
for(i = 0; i < n; i++)//把n个数按照从小到大存放进数组b中
b[i] = i+1;
for(i = 0; i < n; i++)//输入逆序数
cin >> a[i];
for(i = 0; i < n; i++) {
sort(b, b+n);//每次都要排序的目的是为了把已经用过的数通过排序到末尾来达到去掉的目的
if(i != n-1) {
printf("%d ",b[ a[i] ]); //a[i]等于多少就意味着b[a[i]]前面有多少个比b[a[i]]小的数
b[ a[i] ]=n+1; //给b[a[i]]赋上比n大的值,相当于去掉了b[a[i]]
}
else printf("%d\n",b[ a[i] ]);
}
}
return 0;
}