zoj 1201 Inversion

47 篇文章 0 订阅

题目意思    如果输入的是p类串,则输出i类串;如果输出的是i类,则输出p类串。。。

p转i:

寻找在p串中在j左边的比j大的数的个数,i串中的第j个数填为该数。。

i转p:

从尾部开始,若第j个数的值为x,则说明在p串中j的左边有x个数大于j,通过从后到前一个个插入,即可得到p串。。

例如:

2 3 6 4 0 2 2 1 0

1、9 0 0 0 0 0 0 0 0

2、第8位数为1,则说明其左边有一个比它大,所以要排在9后面,即

      9 8 0 0 0 0 0 0 0

3、第7为数为2,则

      9 8 7 0 0 0 0 0 0

4、第6位为2,则

     9 8 6 7 0 0 0 0 0

.。。。。。。。

#include<stdio.h>
int main()
{
	int n,a[55],i,j,s[55],num;
	char x;
	while(scanf("%d",&n)!=EOF&&n)
	{
		scanf("%*c%c",&x);
		for(i=0;i<n;i++)scanf("%d",&a[i]);
		if(x=='P')
		{
			for(i=1;i<=n;i++)
			{
				for(j=n-1;j>=0;j--)
					if(i==a[j])break;
				num=0;
				for(;j>=0;j--)
					if(a[j]>i)num++;
				s[i]=num;
			}


		}
		else
			if(x=='I')
			{
				s[1]=n;
				for(i=n-2;i>=0;i--)
				{
					for(j=n-1;j>a[i];j--)s[j+1]=s[j];
					s[a[i]+1]=i+1;
				}
			}
		printf("%d",s[1]);
		for(i=2;i<=n;i++)printf(" %d",s[i]);
		printf("\n");
	}
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值