Problem Description

Now you are given one non-negative integer n in 10-base notation, it will only contain digits ('0'-'9'). You are allowed to choose 2 integers i and j, such that: i!=j, 1≤i<j≤|n|, here |n| means the length of n’s 10-base notation. Then we can swap n[i] and n[j].

For example, n=9012, we choose i=1, j=3, then we swap n[1] and n[3], then we get 1092, which is smaller than the original n.

Now you are allowed to operate at most M times, so what is the smallest number you can get after the operation(s)?

Please note that in this problem, leading zero is not allowed!

FZOJ2111:Min Number_git Input

The first line of the input contains an integer T (T≤100), indicating the number of test cases.

Then T cases, for any case, only 2 integers n and M (0≤n<10^1000, 0≤M≤100) in a single line.

FZOJ2111:Min Number_git Output

For each test case, output the minimum number we can get after no more than M operations.

FZOJ2111:Min Number_git Sample Input

3
9012 0
9012 1
 9012 2

FZOJ2111:Min Number_git Sample Output

9012
1092
1029
 
题意:给出一个n和交换次数k,求对这个数进行k次交换后得到的最小的数是什么
思路:对这个数两头进行枚举即可
 
#include <stdio.h>
#include <string.h>

int main()
{
	int n,i,j,len,l,MIN,flag,ss;
	char str[1005],min_c,t;
	scanf("%d",&ss);
	while(ss--)
	{
		scanf("%s%d",str,&n);
		if(!n)
		{
			printf("%s\n",str);
			continue;
		}
		len = strlen(str);
		l = 0;
		min_c = str[0];
		for(i = len-1;i>0;i--)//找出整个串最小的,且不为0的放到第一位
		{
			if(str[i]!='0' && str[i]<min_c)
			{
				min_c = str[i];
				flag = i;
			}
		}
		if(min_c!=str[0])//交换
		{
			t = str[flag];
			str[flag] = str[0];
			str[0] = t;
			n--;
		}
		for(i = 1;i<len;i++)//从第二位开始
		{
			if(!n)
				break;
			min_c = str[i];
			for(j = len-1;j>i;j--)//从个位开始找,找到最小的如果小于第i位,即交换
			{
				if(str[j]<min_c)
				{
					min_c = str[j];
					flag = j;
				}
			}
			if(str[j]!=min_c)
			{
				t = str[flag];
				str[flag] = str[i];
				str[i] = t;
				n--;
			}
		}
		printf("%s\n",str);
	}

	return 0;
}