首页 > Web开发 > 详细

2015 湘潭大学程序设计比赛(Internet)--D题-最小的数

时间:2015-04-27 19:58:48      阅读:248      评论:0      收藏:0      [点我收藏+]

最小的数

Accepted : 47   Submit : 276
Time Limit : 1000 MS   Memory Limit : 65536 KB

题目描述

给你一个n位数,每次操作可以选该数任意的相邻两位进行交换,如果最多可以操作k次,那么最终可以得到的最小的数是什么

(n位且不能含前导零)?

输入

有多组测试数据,第一行为数据个数T(T<=10); 每组数据占一行,包含一个数(不超过1000位)和k(0<=k<=1000),中间用空格隔开;

输出

最终能得到的最小的数。

样例输入

2
321654987 1
321654987 2

样例输出

231654987
132654987

Source

WCB

http://202.197.224.59/OnlineJudge2/index.php/Problem/read/id/1228


思路:从第一位向后找m次,如果遇到比第一位小的则把它放到前面,同时让m减去相对应移动的次数,然后从第二位开始找,第三位,第四位。。。;

代码如下:

 

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
#define N 1050
using namespace std;
int main()
{
    int T,i,m,j,k;
    char str[N];
    scanf("%d",&T);
    while(T--)
    {
        scanf("%s %d",str,&m);
        for(i=0;str[i];i++)
        {
            k=i;
            for(j=i+1;j<=i+m&&str[j];j++)
            {
                if(i==0&&str[j]==0)
                    continue;
                if(str[j]<str[k])
                    k=j;
            }
            if(k!=i)
            {
                char ch=str[k];
                for(j=k;j>i;j--)
                    str[j]=str[j-1];
                str[j]=ch;
                m-=(k-i);
            }
        }
        printf("%s\n",str);
    }
    return 0;
}

 

2015 湘潭大学程序设计比赛(Internet)--D题-最小的数

原文:http://www.cnblogs.com/zhengguiping--9876/p/4461065.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!