https://codeforces.com/contest/1560/problem/F1
题意:
定义一个数字是k美丽的,当且仅当组成他的数字种类数<=k
给出数字n,求最小的>=n的k美丽数
k<=2
k=1,直接枚举全是0-9即可
k=2,枚举是哪两个数字a b,a<b
然后枚举一个可以修改的位置,如果它<a,就改成a,否则改成b
它后面的数全都改成a
当出现一个数既不是a又不是b时,停止位置的枚举
注意出现在数字里的a也是可能被修改的
例如10999,最佳答案是当a=0 b=1时,把0改为1,后面全改0
刚开始还在想答案位数超过n的位数怎么办
这是不存在的, 因为全是9一定满足
#include<bits/stdc++.h> using namespace std; int main() { int T,n,k,len; string s; bool tag; scanf("%d",&T); while(T--) { cin>>s; len=s.length(); string ans(len,'9'); scanf("%d",&k); for(char i='8';i>='0';--i) { string t(len,i); if(t>=s) { if(ans>t) ans=t; } } if(k==1) { cout<<ans<<' '; continue; } for(char a='0';a<'9';++a) for(char b=a+1;b<='9';++b) { tag=true; for(int i=0;i<len;++i) { if(s[i]<b) { string t=s; if(s[i]<a) t[i]=a; else t[i]=b; for(int j=i+1;j<len;++j) t[j]=a; if(ans>t) ans=t; } if(s[i]!=a && s[i]!=b) { tag=false; break; } } if(tag) { if(ans>s) ans=s; } } cout<<ans<<' '; } }