2022-08-20 美团笔试


第1题

送分题。

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

int main() {

    int n;
    string a, b;
    cin>>n;
    cin>>a;
    cin>>b;

    for(int i = 0; i < n; ++i) {
        cout<<a[i]<<b[i];
    }
    cout<<"\n";

    return 0;
}
第2题

3个集合取交集。

#include <bits/stdc++.h>

using namespace std;
using pii = pair<int, int>;
int main() {
    set<pii> st[3];
    int n;
    int x[3], y[3], d[3];
    cin>>n;
    for(int i = 0; i < 3; ++i) {
        cin>>x[i]>>y[i];
    }
    for(int i = 0; i < 3; ++i) {
        cin>>d[i];
    }
    for(int i = 0; i < 3; ++i) {
        for(int dx = -d[i]; dx <= d[i]; ++dx) {
            int xx = x[i] + dx, dy = d[i] - abs(dx);
            if(xx < 1|| x[i] > n) {
                continue;
            }
            if(y[i] - dy > 0 && y[i] - dy <= n)
                st[i].insert(make_pair(x[i] + dx, y[i] - dy));
            if(y[i] + dy > 0 && y[i] + dy <= n)
                st[i].insert(make_pair(x[i] + dx, y[i] + dy));
        }
    }
    set<pii> ans1;
    set<pii> ans;
    set_intersection(st[0].begin(), st[0].end(), st[1].begin(), st[1].end(), inserter(ans, ans.begin()));
    set_intersection(st[2].begin(), st[2].end(),ans.begin(), ans.end(), inserter(ans1, ans1.begin()));
    cout<<ans1.begin()->first<<" "<<ans1.begin()->second<<"\n";
    return 0;
}
第3题

数学题,排序。

#include <bits/stdc++.h>

using namespace std;

int main() {

    int n, m;
    double ans = 0.0;
    cin>>n>>m;
    vector<double> a(n, 0);
    vector<double> p(n, 0);

    for(int i = 0; i < n; ++i) {
        cin>>p[i];
    }
    for(int i = 0; i < n; ++i) {
        cin>>a[i];
        ans += a[i] * p[i] / 100.0;
        a[i] *= ((100.0 - p[i]) / 100.0);
    }
    
    sort(a.begin(), a.end());
   
    for(int i = 0; i < m; ++i) {
        ans += a[n - 1 - i];
    }
    printf("%.2f\n", ans);

    return 0;
}
第4题

动态规划,与最短编辑距离类似。

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

int main() {
    
    int n, m;
    cin>>n>>m;
    vector<int> a(n, 0);
    vector<int> b(m, 0);
    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));
    vector<int> sa(n + 1, 0);
    vector<int> sb(m + 1, 0);
    dp[0][0] = 0;
    for(int i = 1; i <= n; ++i) {
        sa[i] = abs(sa[i - 1]) + abs(a[i - 1]);
        dp[i][0] = sa[i];
    }
    for(int i = 1; i <= m; ++i) {
        sb[i] = abs(sb[i - 1]) + abs(b[i - 1]);
        dp[0][i] = sb[i];
    }
    int ans = 0;
    for(int i = 1; i <= n; ++i) {
        for(int j = 1; j <= m; ++j) {
            dp[i][j] = min(abs(a[i - 1] - b[j - 1]) + dp[i - 1][j - 1], abs(a[i - 1]) + dp[i - 1][j]);
            dp[i][j] = min(dp[i][j], abs(b[j - 1]) + dp[i][j - 1]);
            
        }
    }
    cout<<dp[n][m]<<"\n";
    return 0;
}
第5题

双指针,模拟。

#include <bits/stdc++.h>

using namespace std;

int main() {

    int n, m;
    cin>>n>>m;
    vector<int> b(n, 0);
    vector<int> a(m, 0);
    for(int i = 0; i < n; ++i) {
        cin>>b[i];
    }
    for(int i = 0; i < m; ++i) {
        cin>>a[i];
    }
    sort(a.begin(), a.end());
    sort(b.begin(), b.end());

    int ans = 0;
    int pa = 0, pb = 0;
    while(pa < m && pb < n) {
        if(a[pa] >= b[pb]) {
            ans += a[pa];
            ++pb;
        } else {
            ++pa;
        }
    }
    if(pa >= m && pb < n) {
        cout<<"-1\n";
    } else {
        cout<<ans<<"\n";
    }
    return 0;
}





#美团笔试##做完美团2023秋招笔试,你还好吗#
全部评论
大佬第四题过了吗 我也是跟你一样。但只过18%
点赞 回复
分享
发布于 2022-08-20 12:15 浙江
最后一个二分做的😂
1 回复
分享
发布于 2022-08-20 12:10 四川
滴滴
校招火热招聘中
官网直投
我咋只有四道题,还有三个选择题,不会看漏了吧
点赞 回复
分享
发布于 2022-08-20 12:13 广东
第二题剪完枝还是90%,想不明白还能怎么剪
点赞 回复
分享
发布于 2022-08-20 12:24 北京
请问大佬第三题这个代码ac了吗
点赞 回复
分享
发布于 2022-08-20 16:22 辽宁
贴个图,3楼的朋友可以看看,我没发现错误
点赞 回复
分享
发布于 2022-08-20 17:34 浙江
第3题可以不用排序,用快速选择算法,时间复杂度可以从O(nlogn)降到O(n)。
点赞 回复
分享
发布于 2022-08-20 13:12 广东
这个dp之前没看过能想出来吗
点赞 回复
分享
发布于 2022-08-20 18:44 浙江

相关推荐

5 16 评论
分享
牛客网
牛客企业服务