# FZU OJ 2111 Min Number (贪心）

Problem 2111 Min Number

## 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)?

## 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.

## Output

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

## Sample Input

39012 09012 19012 2

901210921029

## 题意：给你一个数n，和交换次数m，要求经过m次交换之后的最小的数是多少，不能有前导零。

#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
int main()
{
char num[20000];
int len, t, m, k, i, j;
cin >> t;
while (t--)
{
cin >> num >> m;
len = strlen(num);
if (m != 0)//m为1的情况
{
for (i=0, k=0; i<len; i++)
{
if (num[i] < num[k] && num[i] != '0')//比较最小值
{
k = i;
}
}
if (num[0] > num[k])
{
swap(num[0], num[k]);//交换
m--;
}
}
for (i=1; i<len && m != 0; i++)//从第二位开始找
{
for (j=i, k=j; j<len; j++)//查找最小值
{
if (num[j] < num[k])
{
k = j;
}
}
if (num[i] > num[k])
{
swap(num[i], num[k]);//交换
m--;
}
}
cout << num << endl;
}
return 0;
}

• 广告
• 抄袭
• 版权
• 政治
• 色情
• 无意义
• 其他

120