卡片游戏
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("\n");
61 memset(a,'0',sizeof(a));
62 }
63 }