卡片遊戲
Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)
Total Submission(s): 841 Accepted Submission(s): 263
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
356598765432109876105432
Sample Output
55612345678901678905432
題目大意:給你一排有序的0~9的數,一次把他們擺在桌子上,每次擺的數要麼在這行數的最左邊要麼就在最右邊。問你可以組成最小的數。當然0不可以當先導。開始不懂得如何貪心。然後就按位的依次取出來,不過遇到0了不確定是不是把它放在前面,有可能後面的有1或者什麼的。思路比較混亂然後就直接WA了。後來居然超蛋的想把0~9的個數直接統計輸出,準備寫的時候發現顛覆了題目的意思,只能放最左最右。
解題思路:主要是貪心,需要把最小的不為0且最靠後的那個值找到,只能把它當成最後結果的第一位,這樣才最小。自己可以細細地品味下。然後index前面的就按開始那種判斷就可以了,index後面的就直接輸出嘍,只能排在後面。具體思路見代碼。
題目地址:卡片遊戲
AC代碼:
#include<iostream>#include<cstring>#include<string>#include<cstdio>using namespace std;char a[102];char tmp[2];string res;int main(){ int tes,i,len,index; scanf("%d",&tes); while(tes--) { char p='9'; //初始化 scanf("%s",a); res=""; //初始化 len=strlen(a); for(i=0;i<len;i++) //知道index { if(a[i]!='0'&&a[i]<=p) { p=a[i]; index=i; } } tmp[0]=a[0],tmp[1]='\0'; res=res+tmp; for(i=1;i<index;i++) //前面的需要判斷是不是比第一位大 { tmp[0]=a[i],tmp[1]='\0'; if(a[i]<=res[0]) res=tmp+res; else res=res+tmp; } if(index>0) { tmp[0]=a[index],tmp[1]='\0'; //index res=tmp+res; } for(i=index+1;i<len;i++) //後面的直接只能插在後面 { tmp[0]=a[i],tmp[1]='\0'; res=res+tmp; } cout<<res<<endl; } return 0;}
這幾道題都是2013金山西山居創意遊戲程式挑戰賽——初賽(2)的三道題目,沒想到shiyuankongbu也做了。