美团笔试(2023 08/26)AK代码

题1(种菜)

算数题。

#include <iostream>
using namespace std;

int main() {
    int x, y, z;
    cin >> x >> y >> z;
    int d = x * 3 + y;
    int day = z / d;
    int res;
    if (day * d < z) {
        day++;
    }
    if (day * d == z) {
        res = day * 3;
    } else {
        if (day * d - 2 * x >= z) {
            res = day * 3 - 2;
        } else if (day * d - x >= z) {
            res = day * 3 - 1;
        } else {
            res = day * 3;
        }
    }
    cout << res;
}

题2(结账)

算数题。

#include <iostream>
#include <vector>
using namespace std;

int main() {
    int n, m;
    cin >> n >> m;
    int k, c;
    vector<long long> C(m, 0);
    for (int i = 0; i < n; i++) {
        cin >> k >> c;
        int p;
        int cost = c / k;
        if (cost * k < c) {
            cost++;
        }
        for (int j = 0; j < k - 1; j++) {
            cin >> p;
            p--;
            C[p] += cost;
        }
    }
    for (int i = 0; i < m; i++) {
        cout << C[i] << ' ';
    }
}

题3(最大数组和)

排序取大的那部分累乘。O(nlogn)。

#include <algorithm>
#include <iostream>
#include <vector>

using namespace std;

int main() {
    int n, k;
    cin >> n >> k;
    vector<long long> a(n);
    for (int i = 0, t; i < n; i++) {
        cin >> a[i];
    }
    sort(a.begin(), a.end());
    long long base = a[n - 1];
    int i = n - 2;
    int m = 0;
    for (; i >= n - k - 1; i--) {
        base = (base * a[i]) % (1000000007);
        m++;
    }
    while(i >= 0) {
        base += a[i];
        base %= 1000000007;
        i--;
    }
    base += m;
    cout << base;
}

题4(重排数组,相加后满足约束)

排序后,直接校验约束。O(nlogn)。

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

bool solve(vector<int> A, vector<int> B, int m) {
    int n = A.size();
    sort(A.begin(), A.end());
    sort(B.begin(), B.end());
    for (int i = 0; i < n; i++) {
        int j = n - i - 1;
        int value = A[i] + B[j];
        if (! (value >= 1 && value <= m)) {
            return false;
        }
    }
    return true;
}

int main() {
    int q;
    cin >> q;
    for (int v = 0; v < q; v++) {
        int n, m;
        cin >> n >> m;
        vector<int> A(n), B(n);
        for (int i = 0; i < n; i++) {
            cin >> A[i];
        }
        for (int i = 0; i < n; i++) {
            cin >> B[i];
        }
        if (solve(A, B, m)) {
            cout << "Yes" << endl;
        } else {
            cout << "No" << endl;
        }
    }
}

题5(均值为k的最长子串)

都减去k,计算前缀和存map,再一次遍历查找最远相同前缀和。O(n)。

#include <iostream>
#include <unordered_map>
#include <vector>
using namespace std;

int main() {
    int n, k;
    cin >> n >> k;
    vector<int> A(n);
    for (int i = 0; i < n; i++) {
        cin >> A[i];
        A[i] -= k;
    }
    unordered_map<long long, int> m;
    long long sum = 0;
    for (int i = 0; i < n; i++) {
        sum += A[i];
        m[sum] = i;
    }
    sum = 0;
    int res = -1;
    for (int i = 0; i < n; i++) {
        sum += A[i];
        if (sum == 0) {
            res = i + 1;
        } else {
            if (m[sum] > i) {
                int j = m[sum];
                res = max(res, j - i);
            }
        }
    }
    cout << res;
}

#美团笔试#
全部评论

相关推荐

点赞 评论 收藏
分享
07-31 14:40
门头沟学院 Java
代码主理人:触发重传机制了,可能是服务器负载太高了,ACK丢包了
找工作时遇到的神仙HR
点赞 评论 收藏
分享
我只是一个小白菜:我还用不惯m4,也是山猪吃不了细糠了
投递字节跳动等公司10个岗位
点赞 评论 收藏
分享
评论
6
4
分享

创作者周榜

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