注解
1、如果输入P,那么就只需要从后往前依次遍历,以后面的元素为基准,用它前面的元素依次跟它比较,只要比它大,该元素的逆序数就要加一。
2、如果输入I,就是从小往大依次填元素即可。比如题目的案例,1前面有2个元素比它大,那么1肯定是在第三个位置。需要注意的就是,如果前面的元素已经填了一个比当前要找的元素还大的元素,cnt++。或者是,当前位置的元素还没填任何东西,也需要cnt++。
3、仔细模拟以上两种情况,找到规律即可。属于水题。
代码
#include <iostream>
#include <cstring>
using namespace std;
int main() {
int N;
cin>>N;
while(N) {
char c;
cin>>c;
int a[N+1];
for(int i=1; i<=N; i++) {
cin>>a[i];
}
int ans[N+1];
memset(ans, 0, sizeof(ans));
if(c=='P') {
for(int i=N; i>=1; i--) {
for(int j=i-1; j>=1; j--) {
if(a[j]>a[i]) {
ans[a[i]]++;
}
}
}
} else {
for(int i=1; i<=N; i++) {
int cnt = 0;
for(int j=1; j<=N; j++) {
if(cnt==a[i]) {
if(ans[j]) {
continue;
} else {
ans[j] = i;
break;
}
}
if(ans[j] && ans[j]>i) {
cnt++;
} else if(ans[j]==0) {
cnt++;
}
}
}
}
cout<<ans[1];
for(int i=2; i<=N; i++) {
cout<<" "<<ans[i];
}
cout<<endl;
cin>>N;
}
return 0;
}