题目描述
一个无前导0的n位数,有一个操作,能把这个n位数中的某个数码全部替换成另外一个。 你最多能操作k次,请问能转化成不含前导0的最小的n位数是什么?
比如52429,最多操作3次,可以转换的最小的数为52429→12429→10409→10009
输入格式
第一行是一个整数T(1≤T≤1000),表示样例的个数。
每个样例的第一行是两个整数n,k, (1≤n≤1000,1≤k≤10)。 第二行是一个n位数。
输出格式
依次输出每个样例的结果,为一个n位数。
样例输入
3 1 1 1 2 1 10 5 3 52429样例输出
0 10 10009
解题思路: 对比代码注释
AC代码:
#include <stdio.h>
int main()
{
int T,n,k;
char num[1010] = {0};
scanf("%d",&T);
while (T --)
{
scanf("%d %d",&n,&k); // 输入
scanf("%s",num);
if (num[0] == '1') k ++; // 如果最高位是1, 则=1的数就不需要变换,令 k ++, 即不需要给最高位留变换次数
for (int i = 1; i < n && k > 1; i ++, k --) // k>1,默认少一次变换次数,给最高位留一次变换次数。
{
if (num[i] == '0' || num[i] == num[0]) k ++; // 如果该位数字为 0 或 与最高位相等, 不需要处理
else
{
for (int j = i+1; j < n; j ++) // 所有位上 与该位数字相同 的数,都变成 0
if (num[j] == num[i])
num[j] = '0';
num[i] = '0';
}
}
for (int i = 1; i < n; i ++) // 处理 最高位
if (num[i] == num[0])
num[i] = '1';
num[0] = '1';
if (n == 1) num[0] = '0'; // 如果只有一位,最高位可以为0
printf("%s\n",num);
}
return 0;
}