F1 - Nearest Beautiful Number (easy version)(预处理)

Posted zjj0624

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了F1 - Nearest Beautiful Number (easy version)(预处理)相关的知识,希望对你有一定的参考价值。

题意
给你两个数n,k,让你找到大于等于n的最小的k-beautiful数。
k-beautiful数就是数字的种类数小于等于k的数。
n的范围是1<=n<=1e9.
k的范围是1<=k<=2.
举个例子 比如 177890 2,得到的最小的2-beautiful是181111.
思路
刚开始的时候k=1的时候很简单,就直接模拟就可以了,但是当k=2的时候,刚开始我也想直接模拟,可是发现总会少考虑情况,最后看了题解发现我们可以把所有的1-beautiful数和2-beautiful都直接预处理出来,存起来。
代码

#include <bits/stdc++.h>
#define ll long long
#define fi first
#define se second
#define pb push_back
#define me memset
#define rep(a,b,c) for(int a=b;a<=c;++a)
#define per(a,b,c) for(int a=b;a>=c;--a)
const int N = 1e7 + 10;
const int mod = 1e9 + 7;
const int INF = 0x3f3f3f3f;
using namespace std;
typedef pair<int,int> PII;
typedef pair<ll,ll> PLL;
ll ans[N];
int cnt;
void init()

    unordered_map<ll,bool>mp;
    for(int i=0 ; i<=9 ; i++)
    
        for(int j=0 ; j<=9 ; j++)
        
            for(int len=1 ; len<=9 ; len++)
            
                for(int k=0 ; k<(1<<len) ; k++)
                
                    int sum=0;
                    int cc=1;
                    for(int z=0 ; z<len ; z++)
                    
                        if(k&(1<<z)) sum+=i*cc;
                        else sum+=j*cc;
                        cc*=10;
                    
                    if(!mp[sum])
                    
                        ans[++cnt]=sum;
                        mp[sum]=true;
                    
                
            
        
    

int main()

    init();
    sort(ans+1,ans+1+cnt);
    int t;
    cin>>t;
    while(t--)
    
        int c[20];
        int n,k;
        cin>>n>>k;
        if(n==1000000000&&k==2)
        
            cout<<"1000000000"<<endl;
            continue;
        
        int x=n;
        int len=0;
        while(x)
        
            c[++len]=(x%10);
            x/=10;
        
        reverse(c+1,c+1+len);
        if(k==1)
        
            for(int i=1 ; i<=9 ; i++)
            
                bool flag=true;
                for(int j=1 ; j<=len ; j++)
                
                    if(c[j]>i)
                    
                        flag=false;
                        break;
                    
                    else if(i>c[j])
                    
                        flag=true;
                        break;
                    
                
                if(flag) for(int j=1 ; j<=len ; j++) cout<<i;
                if(flag) cout<<endl;
                if(flag) break;
            
        
        else
        
            int cc=lower_bound(ans+1,ans+1+cnt,n)-ans;
            cout<<ans[cc]<<endl;
        
    
    return 0;

以上是关于F1 - Nearest Beautiful Number (easy version)(预处理)的主要内容,如果未能解决你的问题,请参考以下文章

F1 - Nearest Beautiful Number (easy version)(预处理)

F1 - Nearest Beautiful Number (easy version)(预处理)

Codeforces Round #739 (Div. 3) F1. Nearest Beautiful Number (easy version)

Codeforces Round #739 (Div. 3) F1. Nearest Beautiful Number (easy version)

F2. Nearest Beautiful Number (hard version) (贪心)

#739 (Div. 3) 1560. F2. Nearest Beautiful Number (hard version)[数位dp+二分]