Fzu 2135 数字游戏【贪心】

来源:互联网 发布:网络词凉凉是什么意思 编辑:程序博客网 时间:2024/05/16 19:48

 Problem 2135 数字游戏

Accept: 345    Submit: 548
Time Limit: 1000 mSec    Memory Limit : 32768 KB

 Problem Description

给一个N位的正整数,该数不包含前导0,先让你调整其中每个数字的位置,得到另一个n位的数,并且使得这个数越小越好,而且这个数不能包含前导0。比如543210可以变成102345,而12345保持不变才是最优结果。

 Input

第一行一个整数T(T<=100),表示有T组数据。

每组数据先输入一行一个整数N(1<=N<=100),表示位数,接下来一行输入一个N位的不包含前导0的正整数。

 Output

每组数据对应一行输出,即调整数字位置后能得到的最小的不包含前导0的数。

 Sample Input

3
6
543210
3
123
3
231

 Sample Output

102345
123
123

思路:


首先我们将原串中出现过的每个数字的次数统计出来。

然后贪心去想:肯定我们是将数小的放在首位。

接着处理最特殊的数字:0

我们只需要确定首位是什么数字之后,我们紧接着将所有的0输出,然后再接着输出从小到大的数字即可。


Ac代码:

#include<stdio.h>#include<string.h>using namespace std;char a[151515];int vis[10];int main(){    int t;    scanf("%d",&t);    while(t--)    {        memset(vis,0,sizeof(vis));        int n;        scanf("%d",&n);        scanf("%s",a);        for(int i=0;i<n;i++)        {            vis[a[i]-'0']++;        }        int f=0;        for(int i=1;i<=9;i++)        {            if(vis[i]>0)            {                if(f==0)                {                    printf("%d",i);                    for(int j=0;j<vis[0];j++)                    {                        printf("0");                    }                    for(int j=1;j<vis[i];j++)                    {                        printf("%d",i);                    }                }                else                {                    for(int j=0;j<vis[i];j++)                    {                        printf("%d",i);                    }                }                f++;            }        }        if(f==0)        {            for(int j=0;j<vis[0];j++)            {                printf("0");            }        }        printf("\n");    }}


0 0
原创粉丝点击