简单题,但是我耗了好大劲。。。一个是题意没弄懂,一个是细节上过不去,这要是正式比赛有贡献好几次wa了,这也是最近比赛暴露的问。。。

说下题意,第一,位置序号是从最后一个开始依次递增,第二,每次是在抹刀上边的才顺序颠倒(和后边的序号没关系。。),第三,输出时要先输出原序列。

明确了这些就没什么了。我是先用另一数组记录排序好的顺序,然后从后向前和原数组比较,相同位置上的数也相同就跳过,否则,在从此位置向前找出该在此的数,若此数不再位置n(数组中的0位置),则先放到位置n,再倒到应放的位置。

以下是代码

#include"stdio.h"
#include"string.h"
#include<algorithm>
using namespace std;
int ord[100],cnt[100];
char str[100];
int main()
{
	int i,j,k,t,temp;
	while(gets(str))
	{
		puts(str);
		t=0;
		memset(ord,0,sizeof(ord));
		memset(cnt,0,sizeof(cnt));
		for(i=0;i<strlen(str);i++)
		{
			if(str[i]!=' ')
			{
				for(;str[i]!=' '&&str[i]!=0;i++)
					cnt[t]=cnt[t]*10+str[i]-'0';
				ord[t]=cnt[t++];
			}
		}
		sort(cnt,cnt+t);
		for(i=t-1;i>=0;i--)
		{
			if(cnt[i]==ord[i])
				continue;
			for(j=i-1;j>=0;j--)
			{
				if(ord[j]==cnt[i])
					break;
			}
			if(j!=0)
			{
				for(k=0;k<=j/2;k++)
				{
					temp=ord[k];
					ord[k]=ord[j-k];
					ord[j-k]=temp;
				}
				printf("%d ",t-j);
			}
			for(k=0;k<=i/2;k++)
			{
				temp=ord[k];
				ord[k]=ord[i-k];
				ord[i-k]=temp;
			}
			printf("%d ",t-i);
		}
		printf("0\n");

	}
	return 0;
}

thunder://QUFmdHA6Ly82OjZAZnRwLmthbjY2LmNvbTo0MTQ2L+OAkDZ255S15b2xd3d3LmR5MTMxLmNvbeOAkeS4gOe6p+aBkOaDp0JE5Lit6Iux5Y+M5a2XMTAyNOmrmOa4hS5ta3ZaWg==/

发表评论

电子邮件地址不会被公开。

Post Navigation