HDU 4550卡片遊戲(貪心)

果7發表於2013-08-20

卡片遊戲

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
3 565 9876543210 9876105432
 

Sample Output
556 1234567890 1678905432
 

                    題目大意:給你一排有序的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也做了。


            

相關文章