• CodeForces 1560F2. Nearest Beautiful Number (hard version)(暴力)


    题目链接

    题目大意

      给你一个n,求最多包含k个不同数字且大于等于n的最小的数。

    解题思路

      我们想要符合条件的数字尽量小,可以想到的一个暴力方法就是不断的让n加1,直到符合条件为止,观察最后得到的数,不难发现其结果要么是等于原数,要么是前面某一位比n大,然后后面全是k个不同数字中最小的数,所以我们可以不考虑后面那些最小的数,就看前几位怎么搞能得到解。
      题目要求用k个不相同的数字,我们就从有k+1个不相同的数字的前缀开始+1,不考虑后面的数字放多少(最后肯定放k个数字中最小的数),不断的循环,直到得到一个数的是由k个不同的数字形成的前缀+后面若干个0为止,后面0的位置全放k个数中最小的数即可。由于每次进位之后后面的位置就不考虑了,所以顶多就加100次左右。

    const int maxn = 2e5+10;
    const int maxm = 2e7+10;
    int calc(int x) {
        int cnt = 0;
        ll res = 0;
        while(x) {
            res |= (1<<(x%10));
            x /= 10;
        }
        while(res) {
            res -= res&-res;
            ++cnt;
        }
        return cnt; 
    }
    int main() {
        IOS;
        int __; cin >> __;
        while(__--) {
            ll n, k; cin >> n >> k;
            while(calc(n)>k) {
                ll f = n, t = 1;
                while(calc(f/10)>k) {
                    f /= 10;
                    t *= 10;
                } ;
                ++f;
                n = f*t;
            }
            cout << n << endl;
        }
        return 0;
    }
    

    f1写的十分丑陋的分类讨论

    const int maxn = 1e5+10;
    const int maxm = 1e6+10;
    int main() {
        IOS;
        int __; cin >> __;
        while(__--) {
            string n; int k;
            cin >> n >> k;
            char a = n[0];
            string ans;
            ans = 'a';
            for (char b = '0'; b<='9'; ++b) {
                string t;
                int f = 0;
                if (k==1) a = b;
                char ch1 = max(a, b);
                char ch2 = min(a, b);
                for (int i = 0; i<n.size() && f>=0; ++i) {
                    char ch = n[i];
                    if (f==1) t += ch2;
                    else if (i+1<n.size() && n[i+1]>ch1) {
                        if (ch2>n[i]) {
                            t += ch2;
                            f = 1;
                        }
                        else if (ch1>n[i]) {
                            t += ch1;
                            f = 1;
                        }
                        else f = -1;
                    }
                    else if (i+1<n.size() && n[i+1]==ch1) {
                        bool ok = 0;
                        for (int j = i+1; j<n.size(); ++j) {
                            if (n[j]<ch1) break;
                            if (n[j]>ch1) {
                                ok = 1;
                                break;
                            }
                        }
                        if (!ok) {
                            if (ch2>n[i]) {
                                t += ch2;
                                f = 1;
                            }
                            else if (ch2==n[i]) t += ch2;
                            else if (ch1>n[i]) {
                                t += ch1;
                                f = 1;
                            }
                            else if (ch1==n[i]) t += ch1;
                            else f = -1;
                        }
                        else {
                            if (ch2>n[i]) {
                                t += ch2;
                                f = 1;
                            }
                            else if (ch1>n[i]) {
                                t += ch1;
                                f = 1;
                            }
                            else f = -1;
                        }
                    }
                    else if (ch2>n[i]) {
                        t += ch2;
                        f = 1;
                    }
                    else if (ch2==n[i]) t += ch2;
                    else if (ch1>n[i]) {
                        t += ch1;
                        f = 1;
                    }
                    else if (ch1==n[i]) t += ch1;
                    else f = -1;
                }
                if (f!=-1) ans = min(ans, t);
            }
            cout << ans << endl;
        }
        return 0;
    }
    
  • 相关阅读:
    【HTML5】元素<script>与<noscript>的使用
    【HTML5】元素<head>的使用
    【HTML5】交互元素menu&command元素
    【HTML5】summary交互元素
    【HTML5】用脚本控制交互元素details元素的使用
    【BIEE】页面跳转以及跳转后返回
    (C语言版)链表(三)——实现双向链表创建、删除、插入、释放内存等简单操作
    哪些年是闰年
    工程师职称评定条件
    linux 网络编程-基础篇01
  • 原文地址:https://www.cnblogs.com/shuitiangong/p/15162342.html
Copyright © 2020-2023  润新知