美团316笔试3,4题

第三题

当时没做出来,后面听说可以2的幂打表,按这个思路重写了一遍,但是无法验证对不对。求找bug。

#include <iostream>
using namespace std;
int main() {
    int n,q;
    cin >> n >> q;
    vector<int> arr(n + 1, 0);
    for (int i = 1; i <= n; i++) {
        cin >> arr[i];
    }
    vector<int> action(n + 1, q); // 每个元素翻倍了几次
    for (int i = 0; i < q; i++) {
        int tmp;
        cin >> tmp;
        action[tmp]--;
    }
    vector<int> dir(q + 1, 1); // 2的次方打表
    for (int i = 1; i <= q; i++) {
        dir[i] = dir[i - 1] * 2 % 1000000007;
    }
    long outcome = 0;
    for (int i = 1; i <= n; i++) {
        outcome += (long)arr[i] * dir[action[i]] % 1000000007;
    }
    cout << outcome % 1000000007;
}

第四题

通过率70%,不知道怎么优化双指针。

#include <iostream>
#include <vector>
using namespace std;
int main() {
    int n;
    cin >> n;
    vector<int> arr(n + 1, 0);
    vector<int> nums_2(n + 1, 0);
    for (int i = 1; i <= n; i++) {
        cin >> arr[i];
        if (arr[i] == 2) {
            nums_2[i] = nums_2[i - 1] + 1;
        }
        else {
            nums_2[i] = nums_2[i - 1];
        }
    }
    int outcome = 0;
    for (int left = 1; left <= n; left++) {  // O(n^2)
        for (int right = left; right <= n; right++) {
            int sum_2 = nums_2[right] - nums_2[left - 1];
            if (sum_2 > right - (left - 1) - sum_2) { // 如果2的个数多于1的个数
                outcome += 2;
            }
            else {
                outcome += 1;
            }
        }
    }
    cout << outcome;
}

#美团##美团笔试#
全部评论

相关推荐

10-30 23:23
已编辑
中山大学 Web前端
去B座二楼砸水泥地:这无论是个人素质还是专业素质都👇拉满了吧
点赞 评论 收藏
分享
评论
2
1
分享
牛客网
牛客企业服务