In-place Sorting

添加链接描述

题意

悲哀是你-你的算法类,你必须写一个排序算法,但你错过了相关的讲座!主题是就地排序算法,您推断的算法必须是将每个输入编号留在其位置的算法,但以某种方式也会对序列进行排序。

当然,你也不能改变任何数字,那么结果只是一个差异序列。但是, 然后它击中你: 如果你翻转一个 6 颠倒, 它成为一个 9, 反之亦然!当然,没有人可以抱怨这一点,因为你没有改变任何数字!交权的最后期限是五点五分。尝试在那之前实现此排序算法!

输入描述:

•输入一个整数n(2≤ n≤ 10000),输入序列中的整数数。

n行,其中包含正整数xi(1≤ xi≤ 1018),序列的第i个编号。

输出描述:

如果序列不能通过翻转输入1中的数字6或9进行非递减排序,则输出“不可能”。否则,输出“可能”,然后是排序的序列-每个数字在其自己的行中。

如果有多个有效的解决方案,请输出最小的序列。

示例1

输入

4
606
900
606
907

输出

possible
606
900
906
907

示例2

输入

4
97
96
66
160

输出

possible
67
69
69
160

示例3

输入

3
80
97
79

输出

impossible

示例4

输入

2
197
166

输出

possible
167
169

思路

1:先把所有的’9‘换成‘6’(都转换成字符串);
2:前面的字符串的长度大于后面字符串长度,直接“ impossible”;
3:字符串长的一样,前面的字符串大于后面的字符串时,把后面的字符串中的‘6’全换成‘9’,如果前面的字符串还大于后面的字符串,直接“ impossible”,
如果前面的字符串还小于后面的字符串,把后面的字符串中的’9‘从高位到底位一次变为’6‘,一边’9‘变成’6‘,一边和前边的字符串比较大小,不行则,再把’6‘变成’9‘;

代码

#include "stdio.h"
#include "string.h"
char a[10000][1021];
int l[10009];
int main()
{
    
    
	int i,n,m,j,k;
	k=0;
	scanf("%d",&n);
	for(i=0;i<n;i++)
	{
    
    
		scanf("%s",a[i]);
		l[i]=strlen(a[i]);
		for(j=0;j<l[i];j++)//所有的'9'换成'6'
			if(a[i][j]=='9')
				a[i][j]='6';
	}
	for(i=1;i<n;i++)
	{
    
    
		if(l[i]<l[i-1])
		{
    
    
			k=1;
			break;
		}
		if(l[i]==l[i-1]&&strcmp(a[i],a[i-1])<0)
		{
    
    
			for(j=0;j<l[i];j++)//‘6’全换成‘9’
				if(a[i][j]=='6')
					a[i][j]='9';
			if(strcmp(a[i],a[i-1])<0)
			{
    
    
				k=1;
				break;
			}
			for(j=0;j<l[i];j++)//从高位到底位'9'变成'6'
			{
    
    
				if(a[i][j]=='9')
				{
    
    
					a[i][j]='6';
					if(strcmp(a[i],a[i-1])<0)
					{
    
    
						a[i][j]='9';
					}
				}	
			}
		}
	
	}
	if(k)
	printf("impossible\n");
	else
	{
    
    
		printf("possible\n");
		for(i=0;i<n;i++)
		printf("%s\n",a[i]);
	}
}

猜你喜欢

转载自blog.csdn.net/weixin_53623850/article/details/117044964
今日推荐