hdu 模拟 贪心 4550

                                    卡片游戏

Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)
Total Submission(s): 1704    Accepted Submission(s): 500


Problem Description
  小明最近宅在家里无聊,于是他发明了一种有趣的游戏,游戏道具是N张叠在一起的卡片,每张卡片上都有一个数字,数字的范围是0~9,游戏规则如下:
  首先取最上方的卡片放到桌子上,然后每次取最上方的卡片,放到桌子上已有卡片序列的最右边或者最左边。当N张卡片全部都放到桌子上后,桌子上的N张卡片构成了一个数。这个数不能有前导0,也就是说最左边的卡片上的数字不能是0。游戏的目标是使这个数最小。
  现在你的任务是帮小明写段程序,求出这个最小数。
 

Input
第一行是一个数T,表示有T组测试数据;
然后下面有T行, 每行是一个只含有0~9的字符串,表示N张叠在一起的卡片,最左边的数字表示最上方的卡片。

[Technical Specification]
T<=1000
1 <= N <= 100
 

Output
对于每组测试数据,请在一行内输出能得到的最小数。
 

Sample Input
3
565
9876543210
9876105432
 

Sample Output
556
1234567890
1678905432
 

Source
2013金山西山居创意游戏程序挑战赛——初赛(2)
 

Recommend
liuyiding   |   We have carefully selected several similar problems for you:  5634 5633 5632 5631 5630                     

      

 1 /*
 2     分析 : 给你的一串数字中  大致 分为两种情况  1 : 有 0 2: 无 0
 3     之所以 有这两种情况是因为 0 不能放在开头
 4     现在  考虑一下 这两种情况 能不能尽量的合并处理    应该能
 5                                                                    */
 6 //找到 所给的 数字钟最靠后并且最小(第一次的时候,不能是0)数字,这个数字就放在 开头 这个数字后面跟随的数字就放在最末位 ,
 7 // 然后 除了这几个数字 剩下的前面的数字也执行此操作(这次 最小的数字 可以是0 )然后  放到上一次 排列数字的中间
 8 #include<cstdio>
 9 #include<cstring>
10 #include<algorithm>
11 using namespace std;
12 int main()
13 {
14     char a[111];
15     int b[111],i,j,q,m,n,l,miin,address,c[111],begin,end;   //begin 和 end 分别代表着   最后队列里 还未填充 部分的 开始 和结束
16     scanf("%d",&n);
17     while(n--)
18     {
19         scanf("%s",a);
20         l=strlen(a);
21         for(miin=1000,i=0;i<l;i++)
22         {
23             b[i]=a[i]-'0';
24         }
25         q=begin=0;
26         address=10;
27         while(address)
28         {
29             for(i=0;i<l;i++)
30             {
31                 if(b[i]==11)
32                     break;
33                 if(q==0)
34                 {
35                     if(miin>=b[i]&&b[i]!=0)
36                     {
37                         address=i;             //找到最后一个最小且不等零的数字的 地址
38                         miin=b[i];
39                     }
40                 }
41                 else
42                     if(miin>=b[i])
43                     {
44                         address=i;
45                         miin=b[i];
46                     }
47             }
48             miin=1000;
49             q++;
50             c[begin++]=b[address];
51             b[address]=11;
52         }
53         for(i=0;i<begin;i++)
54             printf("%d",c[i]);
55         for(i=0;i<l;i++)
56         {
57             if(b[i]!=11)
58                 printf("%d",b[i]);
59         }
60         printf("
");
61         memset(a,'0',sizeof(a));
62     }
63 }
原文地址:https://www.cnblogs.com/A-FM/p/5222933.html