CF1560 F1. Nearest Beautiful Number (easy version)

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<<'\n';
            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<<'\n';
    }
}

 

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