题目:
题目大意:
给出一个数字T,代表有几个样例。
下面T行每行包含两个数,第一个代表待变换的数字 n ,第二个代表改变的次数m。
找出不超过 m 次的变换后n的最小值(第一位不能为0)。
变换:n中的数字2个位置的变换。
eg: 2314 将 1 位和 3位进行一次换位 ,变成 1324。
解题思路:
开始觉得暴力超时,结果看M相对较小,可以暴力求解。
从第一位开始变换,找出之后位置上最小的值。考虑下第一位的特殊情况就OK。
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int main(){
int n;
char St[1005];
int m;
scanf("%d",&n);
while(n -- ){
scanf("%s %d",St,&m); //由于n太大,所以输入字符串
for (int i = 0; i < strlen(St) && m;i++){ //从头开始从头开始替换
int k = i;
for (int j = strlen(St)-1;j > i; j--){
if (St[k] > St[j] && (i !=0 || St[j] != '0')){ // 找出之后位置适合的最小值
k = j; // 记录最小值
}
}
if (k != i){
swap(St[i],St[k]); // 交换当前位置与最小值位置的数值
m --;
}
}
printf("%s\n",St);
}
return 0;
}