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);
    }
}

 

posted @ 2021-09-07 20:43  TRTTG  阅读(46)  评论(0编辑  收藏  举报