ZOJ 1201 逆序数序与其求原序

///////////////////////////////////////////////////////////////////////
//Inversion
//逆序数序与其求原序
#include<iostream>
#include<string>
using namespace std;
char nor[100];
long shuru[10000];
long chu[10000];
long i,j,k,jishu;

 

 

void perm(int n)
{
    jishu=0;
    for(i=0;i<n;i++)
        cin>>shuru[i];
    for(i=0;i<n;i++)                          //各个数字的输出
    {
        for(j=0;j<n;j++)                      //一个数字前有几个大数
        {
            if(shuru[j]>i+1)
                jishu++;
            else if(shuru[j]==i+1)
                break;
        }
        cout<<jishu;
        if(i!=n-1)
            cout<<" ";
        jishu=0;
    }
}

 


void inv(int n)
{
    int temp;
    for(i=0;i<n;i++)
        cin>>shuru[i];
    for(j=0;j<n;j++)
        chu[j]=n-j;
    for(i=0;i<n;i++)                         //这循环让n个数都作一次交换
    {
        jishu=0;
        for(k=n-1;k>=0;k--)
        {
            if(chu[k]==i+1)
                break;
        }
        j=0;
        do{                                  //这循环交换第i个数字与其合适的位置
            if(jishu==shuru[i]&&chu[j]>chu[k] && j<k)
            {
                temp=chu[j];
                chu[j]=chu[k];
                chu[k]=temp;
                break;
            }
            if(chu[j]>chu[k] && jishu<=shuru[i])
            {
                jishu++;                
            }
            j++;
            if(chu[j]>chu[k] && jishu==shuru[i]-1 && k<j)
            {
                temp=chu[j];
                chu[j]=chu[k];
                chu[k]=temp;
                break;
            }
        }while(j<n);
    }
    for(i=0;i<n;i++)
    {
        cout<<chu[i];
        if(i!=n-1)
            cout<<" ";
    }
}

 

    
int main()
{
    int n;
    while(cin>>n)
    {
        if(n==0)
            return 0;
        cin>>nor;
        if(strcmp(nor,"P")==0)
            perm(n);
        else
            inv(n);
        cout<<endl;
    }
    return 0;
}

 

 

你可能感兴趣的:(ZOJ)