链接:http://acm.hdu.edu.cn/showproblem.php?pid=4550
题目中文,就不解释题意了
这个题A后我也看过其他的解题报告,但是肿么有种感觉我的算法更容易理解的样子呢,嘿嘿
看到这个题首先想到的就是取出一张卡片p后,如果p小于等于当前序列第一个数字的话
那么就放在最左边,否则放在最右边。但是题目中的数字是从0开始,这个0就成问题了。
首先毫无疑问的是最后的结果第一位肯定是所有卡片中所有非0数字中最小的那个,我们
就选择“非0中最小的最右的那个数字,下标为idx”做结果的第一个数字(为什么简单分析下
就能得出),找到这个数字后这个问题就变得简单了,不管我后面的0有多少个多少情况,
反正我第一个数字已经找到了,后面随便怎么放都不会出现有前导0的非法情况。
于是就可以从0到idx直接使用先前提到的方法而不需要判断特殊情况,而idx后面的数字肯
定不能放在前面,最后直接按顺序输出idx后面的数字就行了
因为要前插后插感觉用链表有点麻烦就用了两个数组。
#include<stdio.h>
#include<string.h>
char s[110];
char a[110],b[110];
int main()
{
int i,len,cas;
scanf("%d",&cas);
while(cas--)
{
scanf("%s",s);
len=strlen(s);
int idx,up1=0,up2=0;
char min='9';
for(i=0;i<len;i++)
if(s[i]!='0'&&s[i]<=min) min=s[i],idx=i;
for(i=0;i<idx;i++)
if(up1==0||s[i]<=a[up1-1])
a[up1++]=s[i];
else
b[up2++]=s[i];
printf("%c",min);
for(i=up1-1;i>=0;i--)
printf("%c",a[i]);
for(i=0;i<up2;i++)
printf("%c",b[i]);
for(i=idx+1;i<len;i++)
printf("%c",s[i]);
printf("\n");
}
return 0;
}