http://acm.hdu.edu.cn/showproblem.php?pid=2404
解该题需要一个巧妙的想法:
注意到ai其实是指i的逆序数,便可以知道从知道每个数的逆序数,就可以推出原来每个数的排序。
比如知道0,0,0,0,0,0,0,便知原来数排列为:
1 2 3 4 5 6 7
任何一个逆序数排列,都可以很容易推出1所在位置,因为没有什么比1更小的数。
从这个角度出发,便可以得到这个规律:
若这个数当前最小,则他的位置是固定的。
于是,我们把比这个数小的数去掉,就可以知道他的位置。
而他的逆序数+1就是他所在的位置。
下面AC代码给出:
#include<iostream>
using namespace std;
int main(){
int i;
int n;
int d[501];
int s[501];
int g[501];
while (cin>>n,n)
{
for (i = 1; i <= n; i++){
cin >> d[i];
s[i] = i;
}
int t = 1;
int m = n;
while (m--)
{
g[s[d[t] + 1]] = t;
int k = t;
int cnt = 1;
for (i = 1; i <=n; i++){
if (i != d[k] + 1){
s[cnt++] = s[i];
}
}
t++;
}
for (i = 1; i < n; i++){
cout << g[i] << ",";
}
cout << g[n] << endl;
}
return 0;
}