所以就把第一次的交换拿出来单独考虑,首先贪心查找非零的最小值,然后把最小值和第一位交换,每交换一次,交换次数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;
}
本文介绍了一种通过有限次交换操作使整数数值最小化的算法实现。该算法首先单独处理首次交换以找到非零最小值并与首位交换,随后对剩余位进行贪心选择,寻找更小数值并进行交换,直至达到指定交换次数。
1812

被折叠的 条评论
为什么被折叠?



