CF1560 F2. Nearest Beautiful Number (hard version)
https://codeforces.com/contest/1560/problem/F2
题意:
定义一个数字是k美丽的,当且仅当组成他的数字种类数<=k
给出数字n,求最小的>=n的k美丽数
贪心的思路
每次找出现第k+1种数字的位置
从这个位置开始往前找第一个不是9的位置,把它加1,后面的全改为0
持续进行这个操作,直到不存在第k+1种数字
#include<bits/stdc++.h> using namespace std; set<char>st; int main() { int T,n,k,len,pos; char s[11]; bool tag; scanf("%d",&T); while(T--) { scanf("%s%d",s+1,&k); len=strlen(s+1); while(1) { st.clear(); for(int i=1;i<=len;++i) st.insert(s[i]); if(st.size()<=k) break; st.clear(); for(int i=1;;++i) { st.insert(s[i]); if(st.size()>k) { pos=i; while(s[pos]=='9') pos--; s[pos]++; for(int j=pos+1;j<=len;++j) s[j]='0'; break; } } } printf("%s\n",s+1); } }