添加链接描述
题意
悲哀是你-你的算法类,你必须写一个排序算法,但你错过了相关的讲座!主题是就地排序算法,您推断的算法必须是将每个输入编号留在其位置的算法,但以某种方式也会对序列进行排序。
当然,你也不能改变任何数字,那么结果只是一个差异序列。但是, 然后它击中你: 如果你翻转一个 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]);
}
}