8.20 美团笔试 AK题解

第一题很简单,就不描述了。

#include <bits/stdc++.h>
using namespace std;
using LL = long long;

int main() {
    //freopen("test.txt", "r", stdin);
    ios::sync_with_stdio(false);
    int n;
    string a, b, ans;
    cin >> n >> a >> b;
    for (int i = 0; i < n; ++i) {
        ans.push_back(a[i]);
        ans.push_back(b[i]);
    }
    cout << ans << endl;
    // 第一次没有输出回车,居然0%,醉了
    return 0;
}

第二题大意是,给三个点,给三个曼哈顿距离,求出一个点到这个三个点的曼哈顿距离满足题目给的要求,有多个就输出字典序较小的那个。
输入如下

3 //格子的大小,点的坐标要满足[1, n]
2 1 //第一个点
2 2 //第二个点
2 3 //第三个点
2 1 2 //分别对应的三个距离

我用的纯暴力,没啥好说的

#include <bits/stdc++.h>

using namespace std;
using LL = long long;
set<pair<int, int>> res, ans;
int dir[][2] = {{1,  1},
                {1,  -1},
                {-1, 1},
                {-1, -1}};

set<pair<int, int>> find_dot(int x, int y, int d, int n) {
    set<pair<int, int>> tmp;
    for (int i = d; i >= 0; --i) {
        for (auto & k : dir) {
            int new_x = x + i * k[0], new_y = y + (d - i) * k[1];
            if (new_x >= 1 && new_x <= n && new_y >= 1 && new_y <= n) {
                tmp.insert(make_pair(new_x, new_y));
            }
        }


    }
    return tmp;
}

int main() {
    //freopen("test.txt", "r", stdin);
    ios::sync_with_stdio(false);
    int n;
    cin >> n;
    int x1, y1, x2, y2, x3, y3;
    cin >> x1 >> y1 >> x2 >> y2 >> x3 >> y3;
    int d1, d2, d3;
    cin >> d1 >> d2 >> d3;
    set<pair<int, int>> dot1 = find_dot(x1, y1, d1, n);
    set<pair<int, int>> dot2 = find_dot(x2, y2, d2, n);
    set<pair<int, int>> dot3 = find_dot(x3, y3, d3, n);
    set_intersection(dot1.begin(), dot1.end(), dot2.begin(), dot2.end(), inserter(res, res.end()));
    set_intersection(res.begin(), res.end(), dot3.begin(), dot3.end(), inserter(ans, ans.end()));
    cout << ans.begin()->first << ' ' << ans.begin()->second;
    return 0;
}

第三题是n道题目,m次作弊机会,作弊就能拿到100%的分数,否则拿到输入给的百分比的分数

#include <bits/stdc++.h>

using namespace std;
using LL = long long;

struct node {
    int a, b, c;

    node(int a, int b, int c) : a(a), b(b), c(c) {}
};

int main() {
//    freopen("test.txt", "r", stdin);
//    ios::sync_with_stdio(false);
    int n, m;
    double ans = 0.0;
    cin >> n >> m;
    vector<int> p(n), scores(n);
    for (int i = 0; i < n; ++i) {
        cin >> p[i];
    }
    for (int i = 0; i < n; ++i) {
        cin >> scores[i];
    }
    vector<node> record;
    for (int i = 0; i < n; ++i) {
        record.push_back(node(p[i], scores[i], (100 - p[i]) * scores[i]));
    }
    sort(record.begin(), record.end(), [](node &x, node &y) {
        return x.c > y.c;
    });
    for (int i = 0; i < m; ++i) {
        ans += record[i].b;
    }
    for (int i = m; i < n; ++i) {
        ans += record[i].a * record[i].b / 100.0;
    }
    printf("%.2f", ans);
    return 0;
}

第四题,让两个数列变得一样。可以消去一个数a,代价是abs(a),或者这个数a改成b,代价是abs(a-b)。最小的代价是多少(类似编辑距离)

#include <bits/stdc++.h>

using namespace std;
using LL = long long;

int main() {
    freopen("test.txt", "r", stdin);
    ios::sync_with_stdio(false);
    int n, m;
    cin >> n >> m;
    vector<int> a(n), b(m);
    for (int i = 0; i < n; ++i) {
        cin >> a[i];
    }
    for (int i = 0; i < m; ++i) {
        cin >> b[i];
    }
    vector<vector<int>> dp(n + 1, vector<int>(m + 1, 0));
    for (int i = 1; i < n + 1; ++i) {
        dp[i][0] = dp[i - 1][0] + abs(a[i - 1]);
    }
    for (int i = 1; i < m + 1; ++i) {
        dp[0][i] = dp[0][i - 1] + abs(b[i - 1]);
    }
    for (int i = 1; i < n + 1; ++i) {
        for (int j = 1; j < m + 1; ++j) {
            if (a[i - 1] == b[i - 1]) dp[i][j] = dp[i - 1][j - 1];
            else dp[i][j] = min(abs(a[i-1] - b[j-1]) + dp[i - 1][j - 1], min(dp[i - 1][j] + abs(a[i - 1]), dp[i][j - 1] + abs(b[j - 1])));
        }
    }
    cout << dp[n][m];
    return 0;
}

第五题,两行数字,n和m个。从m个数字选出能cover住n个数字的序列,m序列每个不限量,最小代价是多少。不能满足就是-1

#include <bits/stdc++.h>

using namespace std;
using LL = long long;

int main() {
    //freopen("test.txt", "r", stdin);
    ios::sync_with_stdio(false);
    int n, m;
    cin >> n >> m;
    vector<int> b(n);
    set<int> a;
    for (int i = 0; i < n; ++i) {
        cin >> b[i];
    }
    for (int i = 0; i < m; ++i) {
        int tmp;
        cin >> tmp;
        a.insert(tmp);
    }
    LL ans = 0;
    //sort(a.begin(), a.end());
    for (int i = 0; i < n; ++i) {
        int target = b[i];
        auto iter = a.lower_bound(target);
        if (iter == a.end()) {
            ans = -1;
            break;
        }
        ans += *iter;
    }
    cout << ans;
    return 0;
}
#美团笔试##做完美团2023秋招笔试,你还好吗#
全部评论
a[i-1]==b[i-1]结果为什么不用考虑dp[i][j-1]和dp[i-1][j]这种删一个的情况呢
点赞 回复 分享
发布于 2022-08-20 16:39 陕西
第三题node存三个int?有可能是小数吧
点赞 回复 分享
发布于 2022-08-20 14:03 广东
对set不是很了解 没全a很难受
点赞 回复 分享
发布于 2022-08-20 13:50 福建
第四题我也这样写的呀为啥只有18😭
点赞 回复 分享
发布于 2022-08-20 13:49 陕西

相关推荐

头顶尖尖的程序员:我也是面了三四次才放平心态的。准备好自我介绍,不一定要背熟,可以记事本写下来读。全程控制语速,所有问题都先思考几秒,不要急着答,不要打断面试官说话。
点赞 评论 收藏
分享
评论
11
24
分享

创作者周榜

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