ZOJ 1201 Inversion

P操作所求逆序对

I操作根据逆序对来求原数组

算是道水题。

#include <iostream>
#include <cstdio>
#include <memory.h>

using namespace std;
const int maxn = 55;
int  P[maxn], ans[maxn], n;
int main(){
    while(scanf("%d", &n) && n){ 
        char str[2];
     
        memset(ans, 0, sizeof(ans));
        scanf("%s", str);
        for(int i = 1; i <= n; ++i){
            scanf("%d", &P[i]);
        }   

        if(str[0] == 'P'){
            for(int i = 1; i <= n; ++i){
                int tmp = 0;
                for(int j = 1; j < i; ++j){
                    if(P[i] < P[j])tmp++;   
                }   
                ans[P[i]] = tmp;
            }   
        }else{
            int tmpn = 0;
            for(int i = n; i >= 1; --i){
                int tmp = P[i], j;
                for(j = 1; j <= tmpn && tmp; ++j){
                    if(ans[j]  > i)tmp--;
                }   
                for(int k = tmpn + 1; k > j; --k){
                    ans[k] = ans[k - 1]; 
                }   
                ans[j] = i;
                tmpn++;
            }   
        }   
        for(int i = 1; i <= n; ++i){
            if(i > 1)printf(" ");
            printf("%d", ans[i]);
        }
        printf("\n");

    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值