卡片游戏(贪心)

题目

小明最近宅在家里无聊,于是他发明了一种有趣的游戏,游戏道具是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

题解:

怎么放牌的大家都是知道的,和第一个相比嘛,小于等于的放前,大于的放后。
因为卡片是从上往下依次拿出来排序的,最后肯定是把非零最小值放第一位嘛,所以我们就找最靠近底部的非零最小值,因为假设有多个相同的非零最小值,那么最靠近底部的那个就是最后放到最前面的,也就是说我们现在能够保证我们找的这个非零最小值的下面都是比它大的,那这一部分就不用再排了,直接按照原来顺序放在末尾。
这样的话,我们就可以把整摞牌分为三部分,min_之前的(这个就按照游戏规则该怎么排怎么排),min_(这个就是第一位的牌),min_之后的(直接按照原来顺序放在末尾)。
其实我们可能会想,不,是我做的时候想了,我们是不知道牌的最小值是几。但是这种做法就是明显知道了最小值是几,并且具体在哪个位置,于是我们才可以放心的排min_前边的0。也就是说这个游戏呢,我们是可以看见牌的信息的,在排之前。

哦对噶,这里还用了string,就是字符串连接起来比较方便

然后还有就是代码用的方法是先把最小值和最小值的信息都记录下来,然后就只看剩下的前后两部分,就是相当于我们先把最小值的挑出来放最前面然后再看其他的。

#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <string.h>
#include <string>
#include <math.h>
#include <queue>
#include <set>
#include <stack>
#include <vector>

#define INF 0x3f3f3f3f
const int MAX = 0x3f3f3f3f;

using namespace std;
typedef long long ll;

int main() {
    int T;
    scanf("%d",&T);
    getchar();
    while(T--)
    {
        string string1,string2,string3;
        char min_='9';
        int mini;
        cin>>string1;
        for(int i=0;i<string1.length();i++)//将最底部的非零最小数的信息记录下来:目的就是为了保证后面的都是大于它的
        {
            if(string1[i]!='0'&&string1[i]<=min_)
            {
                mini=i;
                min_=string1[i];
            }
        }
        for(int i=0;i<string1.length();i++)
        {//前mini个数按要求排好
            if(i<mini&&string1[i]<=string2[0])//如果将拿的牌小于等于首位,那就放前面
            {
                string2=string1[i]+string2;
            }
            if(i<mini&&string1[i]>string2[0])//如果将拿的牌大于首位,那就放后面
            {
                string2+=string1[i];
            }
            if(i>mini)//后面的都是大于我们找的min_了,所以就直接原来怎么排的就怎么排
            {
                string3+=string1[i];
            }
        }
        cout<<min_+string2+string3<<endl;
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_44049850/article/details/86765353