#include<iostream>
#include<cstdio>
#include<vector>
#include<set>
#include<cstring>
using namespace std;
int t, k, vis[15];
string n;
set<char> s;
int main()
{
cin >> t;
while(t --)
{
s.clear();
cin >> n >> k;
for(int i = 0; i < n.size(); i++)
s.insert(n[i]);
if(s.size() <= k)
cout << n << endl;
else
{
int flag = 1;
while(flag)
{
s.clear();
memset(vis, 0, sizeof vis);
int pos = 0, cnt = 0;
for(pos = 0; pos < n.size() && cnt <= k; pos++)
{
int x = n[pos] - ‘0‘;
if(!vis[x]) //!!!vis[n[pos] - ‘0‘]会翻车
{
vis[x] = 1;
cnt ++;
}
}
pos --; //找到第一个使得n有大于k个不同数的位置
if(n[pos] == ‘9‘) pos --; //特判:该位 = 9,则进1
n[pos] ++;
for(int i = pos + 1; i < n.size(); i++) //后面所有位置0
n[i] = ‘0‘;
for(int i = 0; i < n.size(); i++) s.insert(n[i]);
if(s.size() <= k) flag = 0;
}
cout << n << endl;
}
}
}
Codeforces Round #739 (Div. 3) F. Nearest Beautiful Number(思维、贪心)
原文:https://www.cnblogs.com/K2MnO4/p/15171876.html