题解 | #小红的数位删除#

小红的数位删除

https://www.nowcoder.com/practice/a1044c31930341d6a51c9a619254074a

数位删除得到的值是原数值的子序列,只需要生成所有子序列,然后检查即可。

子序列的个数(至多)是,故时间复杂度为,可行.

#include <climits>
#include <iostream>
#include <string>
#include <utility>
#include <vector>
using namespace std;

using vpii = vector<pair<int, int>>;

vpii subseqSet(int a) {
    auto s =  to_string(a);
    int len = s.size();
    vpii res;

    for (int mask = 1; mask < (1 << len); ++mask) {
        int cur = 0;
        int cnt = 0;

        for (int i = 0; i < len; ++i) {
            if ((mask >> i) & 1) {
                cur = cur * 10 + s[i] - '0';
                cnt++;
            }
        }
        res.push_back({cur, len - cnt});
    }
    return res;
}

int solve(vpii& s1, vpii& s2) {
    int ans = INT_MAX;

    for (auto [v, t1] : s1) {
        for (auto [u, t2] : s2) {
            if (u == 0 || v == 0) {
                if (u == 0 && v == 0) ans = min(ans, t1 + t2);
                continue;
            }

            if (u % v == 0 || v % u == 0)  ans = min(ans, t1 + t2);
        }
    }
    if (ans == INT_MAX) return -1;

    return ans;
}



int main() {
    int a, b;
    cin >> a >> b;
    auto s1 = subseqSet(a);
    auto s2 = subseqSet(b);
    cout << solve(s1, s2);
}
// 64 位输出请用 printf("%lld")
全部评论

相关推荐

对空六翼:你真幸运,碰见这么好的人,不像我,秋招的时候被室友骗进cx了
实习好累,可以辞职全力准...
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务