HDU

 1 #include<stdio.h>
 2 #include<string.h>
 3 int main()
 4 {
 5     int i,j,k,l,n,h,t,min,head,tail,num[1000];
 6     char a[1000];
 7     scanf("%d",&t);
 8     for(j=0;j<t;j++)
 9     {
10         scanf("%s",a);
11         n=strlen(a);
12         min=99999;
13         for(i=n-1;i>=0;i--)
14         {
15             if((a[i]!='0')&&(a[i]<min))
16             {
17                 min=a[i];
18                 h=i;
19             }
20         }//从右到左找到第一个非零最小数;
21         if(h==0)
22         {
23             printf("%s
",a);
24             continue;
25         }//如果没有h之前的部分可以直接输出;
26         head=500;
27         tail=500;
28 //分别记录答案序列的头尾位置;
29         num[500]=a[0]-'0';
30         for(i=1;i<h;i++)
31         {
32             if(a[i]-'0'<=num[head])
33             {
34                 head--;
35                 num[head]=a[i]-'0';
36             }
37             else
38             {
39                 tail++;
40                 num[tail]=a[i]-'0';
41             }
42         }//先处理前h的部分
43         head--;
44         num[head]=a[h]-'0';//把第h个数字放在最前面
45         for(i=h+1;i<n;i++)
46         {
47             tail++;
48             num[tail]=a[i]-'0';
49         }//把h之后的部分接在后面;
50         for(i=head;i<=tail;i++)
51         {
52             printf("%d",num[i]);
53         }
54         printf("
");
55     }
56 }
View Code
原文地址:https://www.cnblogs.com/NWUACM/p/6431069.html