题目大意是:给定一个数,定义k为这个数各位上的数字不重复的个数,让你求大于等于这个数的最小的一个数并满足k<=题目中所给的k。
很巧妙的贪心,经过分析每次从个位向高位枚举判断能修改的最低位然后加1,重复这个过程可得到答案。
#include <bits/stdc++.h>
using namespace std;
int calc(int x) {
int t = 0;
for (; x; x /= 10) t |= 1 << (x % 10);
return __builtin_popcount(t);
}
int main() {
int tt;
scanf("%d", &tt);
while (tt--) {
int n, k;
scanf("%d%d", &n, &k);
while (calc(n) > k) {
int a = 1, b = n;
while (calc(b) > k) a *= 10, b /= 10;
a /= 10;
n = (n / a + 1) * a;
}
printf("%d\n", n);
}
return 0;
}