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