FZU Problem 2111 Min Number

来源:互联网 发布:1010软件怎么用 编辑:程序博客网 时间:2024/05/17 01:33
#include<cstdio>#include<cstring>#include<algorithm>using namespace std;int main(){    //freopen("in.txt","r",stdin);    int cas,time,num;    char str[1100],ss[1100];    scanf("%d",&cas);    while(cas--)    {        scanf("%s %d",str,&time);        if(time==0)        {            printf("%s\n",str);            continue;        }        strcpy(ss,str);        sort(ss,ss+strlen(ss));        int i;        for(i=0; ss[i]!='\0'&&ss[i]=='0'; i++);        ss[0]=ss[i];        ss[i]='0';        char min='9';        int index=0;        for( i=0; str[i]!='\0'; i++)        {            if(str[i]=='0') continue;            if(str[i]<min)            {                min=str[i];                index=i;            }        }        char temp;        if(str[index]!=str[0])        {            time--;            temp=str[0];            str[0]=str[index];            str[index]=temp;        }        if(strcmp(str,ss)==0)        {            printf("%s\n",ss);            continue;        }        int flag=0;        num=1;        while(time--)        {            min='9';            index=num;            for(int j=num; str[j]!='\0'; j++)            {                if(str[j]<min)                {                    min=str[j];                    index=j;                }            }            if(index==num)            {                time++;                num++;                continue;            }            temp=str[num];            str[num]=min;            str[index]=temp;            if(strcmp(str,ss)==0)            {                printf("%s\n",ss);                flag=1;                break;            }        }        if(flag==0)            printf("%s\n",str);    }    return 0;}

              用两个数组存输入的一串数字,给ss排序,为避免ss[0]出现0,判断一下,如果是0就让它和第一个不是0的数位交换。然后一次次交换,有点类似于冒泡排序的慢动作,把最小的往前挪,每交换一次之后,检查是否已经是最小的了,如果是直接输出就可以了。注意第一次交换时还是不可以把0放到str[0]。另外只有真正有交换动作时time才会减1。

                             “高教社杯”第三届福建省大学生程序设计竞赛