小于n的最大数

给定A数组其中0 <= a[i] <= 9,给定n。可重复使用A中的元素,要求构造小于n的最大数。

#include <bits/stdc++.h>

using namespace std;
using ll = long long;

const int mod = 1e9 + 7;

void solve() {
    int A[] = {9, 8};
    int n = 9;
    n --;
    map<int, int> mp;
    for(auto x: A) mp[x] = 1;

    int a[10], cnt = 0;
    while(n) {
        a[cnt ++] = n % 10;
        n /= 10;
    }

    function<int(int)> fin = [&](int x) -> int {
        for(int i = x; i >= 0; -- i) {
            if(mp[i]) return i;
        }
        return -1;
    };

    bool f = false;
    stack<int> st;

    if(fin(a[cnt - 1]) == -1) {
        for(int i = cnt - 2; i >= 0; -- i) {
            st.push(fin(9));
        }
    } else {
        for(int i = cnt - 1; i >= 0; -- i) {
            if(f) {
                st.push(fin(9));
                continue;
            }
            int x = fin(a[i]);
            if(x == -1) {
                while(!st.empty()) {
                    int _x = st.top();
                    x = fin(_x - 1);
                    st.pop();
                    i ++;
                    if(x == -1) continue;
                    st.push(x);
                    f = true;
                    break;
                }
            } else {
                if(x != a[i]) f = true;
                st.push(x);
            }
        }
    }
    string ans = "";
    while(!st.empty()) {
        ans = char(st.top() + '0') + ans;
        st.pop();
    }
    cout << ans << '\n';
}

signed main() {
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
#ifdef ACM_LOCAL
    freopen("in", "r", stdin);
    freopen("out", "w", stdout);
#else
    solve();
#endif
    return 0;
}

全部评论

相关推荐

04-26 23:17
已编辑
门头沟学院 C++
#牛客AI配图神器#不鸣科技(服务器开发实习生)一面(40分钟)1.父类指针怎么调用子类的虚函数?2.析构函数需要是虚函数吗?3.父类指针析构子类对象会调用父类的析构吗?4.父类指针析构子类对象时,子类string成员、子类、父类的析构顺序?(没理解清楚,回答不是很好,应该先析构string、子类的析构、父类的析构)5.vector扩容的机制?6.vector拷贝行为可以怎么优化?(移动语义)7.如何在map中遍历删除指定的元素?8.给你一系列的元素,每个元素有一个权重,怎么让取到的元素概率和元素的权重呈比例?(没回答出来,加权随机选择,前缀和+二分查找)9.浮点数如何判断相等?(不知道,浮点数近似存储,因此不能直接==,fabs(a&nbsp;-&nbsp;b)&nbsp;10.手撕一个stack,提供push、pop、top、getMin接口反问:1.技术栈(C++和Lua)2.什么时候出结果二面(45分钟)1.面试官介绍了下面试主要内容,说后面还会有业务三面2.子类、父类、子类的成员类,它们的构造顺序?3.类成员的初始化顺序?4.为什么按照声明顺序而不是初始化列表顺序?从设计者的角度考虑为什么这么设计(开放性问题,面试官对我的回答不太满意,最后给提示,函数重载是一个原因)5.类中的成员类实例存储在栈上还是在堆上?(分情况)6.基类的析构函数为什么建议是虚函数?7.如何判断浮点数是否相等?8.基于内存对齐规则,如何设计一个类?9.在map中如何在遍历过程中删除元素?10.说说条件断点和数据断点?还有的忘了反问:1.不足的地方(思维能力要提高)后续:五分钟后约三面(以为是HR面,结果被告知三面也是技术面)三面(25min)1.问了下感兴趣的技术方向(操作系统、数据库)好那就聊聊操作系统2.进程调度算法有哪些?3.进程和线程的区别?4.线程会共享进程的哪些资源?5.线程栈空间?6.说一说内联函数?7.函数调用的步骤?反问:1.不足之处&nbsp;2.实习生培养方案后续:三面挂了三面那么短就觉得不太对劲果然是g了timeline:4.15&nbsp;投递4.18&nbsp;一面4.23&nbsp;二面4.24&nbsp;三面4.25&nbsp;感谢信#牛客解忧铺##牛客在线求职答疑中心##牛客创作赏金赛##牛客激励计划#
点赞 评论 收藏
分享
04-26 10:50
已编辑
太原理工大学 Java
查看16道真题和解析
点赞 评论 收藏
分享
评论
点赞
1
分享

创作者周榜

更多
牛客网
牛客企业服务