题意:给一个数n求大于n的由不超过k中数组成的数其中(1≤n≤10^9, 1≤k≤10).
思路:首先可以确定目标数跟n位数一样,然后可以贪心的尽量不要让高位变化,尽量向后枚举,只有在本位枚举超过9时,再回到高位枚举,一旦高位增加,后面全部变成0;(总之想办法让变化量变小)
例子:177890 2
177900
178000
179000
180000
181000
181100
181110
181111
#include <bits/stdc++.h>
#include<set>
using namespace std;
int L ,m ;
char a[1000];
int pan()
{
int j,i;
set<char > s;
for(i=0; i<L; i++)
{
s.insert(a[i]);
}
if(s.size() > m) return 1;
else return 0;
}
int main()
{
int j,i,w;
scanf("%d",&w);
while(w--)
{
scanf("%s %d",a,&m);
L=strlen(a);
i=0;
while(pan())
{
set<char > s;
for( i=0; i<L; i++)
{
s.insert(a[i]);
if(s.size()>m)
{
while(a[i]=='9') i--;
a[i]++;
for(j=i+1; j<L; j++) a[j]='0';
break;
}
}
}
printf("%s\n",a);
}
return 0;
}