微众银行笔试 微众银行软件算法笔试

订阅专栏,方便查阅,时刻更新各厂软件算法笔试https://blog.nowcoder.net/zhuanlan/0oDWVm

1、区间计数

题目描述:

给出两个长度均为n的数组A={a1,a2,...,an},B={b1,b2,...,bn}。你需要求出其有多少个区间[L,R]满足数组A中下标在[L,R]中的元素之和在[La,Ra]之中,且数组B中下标在[L,R]中的元素之和在[Lb,Rb]中。

输入描述

第一行有一个正整数N(1≤N≤100000),代表两个数组的长度。

第二行有N个非负整数,范围在0到1000000000之间,代表数组中的元素。

第三行有N个非负整数,范围在0到1000000000之间,代表数组中的元素。

第四行有4个整数La,Ra,Lb,Rb,范围在0到1018之间,代表题目描述中的参数。

输出描述

输出一个整数,代表所求的答案。

样例输入

4

1 4 2 3

2 4 1 1

3 7 4 6

样例输出

3

#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
#include <sstream>

using namespace std;

int bcs1(const vector<int>& nums, int l, int r, int target) {
    while (l < r) {
        int mid = (l + r) / 2;
        if (nums[mid] >= target) {
            r = mid;
        } else {
            l = mid + 1;
        }
    }
    return r;
}

int bcs2(const vector<int>& nums, int l, int r, int target) {
    while (l < r) {
        int mid = (l + r + 1) / 2;
        if (nums[mid] <= target) {
            l = mid;
        } else {
            r = mid - 1;
        }
    }
    return r;
}

int main() {
    int N;
    cin >> N;

    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];
    }

    int La, Ra, Lb, Rb;
    cin >> La >> Ra >> Lb >> Rb;

    vector<int> preA(N + 1), preB(N + 1);

    for (int i = 1; i <= N; ++i) {
        preA[i] = preA[i - 1] + A[i - 1];
        preB[i] = preB[i - 1] + B[i - 1];
    }

    int cnt = 0;

    for (int i = 0; i <= N; ++i) {
        int l = 0, r = i;
        int l1 = bcs1(preA, l, r, preA[i] - Ra);
        int r1 = bcs2(preA, l, r, preA[i] - La);
        int l2 = bcs1(preB, l, r, preB[i] - Rb);
        int r2 = bcs2(preB, l, r, preB[i] - Lb);
        int l3 = max(l1, l2);
        int r3 = min(r1, r2);
        
        if (La <= preA[i] - preA[l3] && preA[i] - preA[l3] <= Ra &&
            La <= preA[i] - preA[r3] && preA[i] - preA[r3] <= Ra &&
            Lb <= preB[i] - preB[l3] && preB[i] - preB[l3] <= Rb &&
            Lb <= preB[i] - preB[r3] && preB[i] - preB[r3] <= Rb) {
            cnt += r3 - l3 + 1;
        }
    }

    cout << cnt << endl;

    return 0;
}

2、吞吞大作战

题目描述:

吞吞大作战是球球大作战的x.0版本,此时球球并不能通过击败其他球球壮大自己,而是获得得分,每一个球球都有一个能量值a_i,能量大的球球可以击败能量小的球球,当一个球球被击败后,击败者可以获得b_i得分。但是为了和谐,每个球球最多只能击败m个其他球球,然后就会强制进入结算环节。数据保证不会有两个球球具有相同的能量值。  请问每个球球最终最多得分多少。

输入描述

输入第一行包含

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

本专栏主要发布嵌入式软件开发相关岗位2023年(2024届)的笔试真题(嵌入式软件开发、通用软件开发、C/C++软件开发、算法工程师、数据开发、测试开发等)主要是算法编程题,其中一些岗位笔试含有对应的选择题、填空题、简单题。

全部评论
这是笔试的几道算法题?
点赞 回复 分享
发布于 2023-05-02 21:21 江苏
用前缀和是不是好一点?
点赞 回复 分享
发布于 2023-05-02 21:21 山东
辅导什么价格
点赞 回复 分享
发布于 2023-05-03 15:28 湖南
mark
点赞 回复 分享
发布于 2023-05-10 11:38 广东
m
点赞 回复 分享
发布于 2023-05-10 15:24 广东
m
点赞 回复 分享
发布于 2023-05-11 12:03 广东
m
点赞 回复 分享
发布于 2023-05-11 18:38 广东

相关推荐

过往烟沉:我说什么来着,java就业面就是广!
点赞 评论 收藏
分享
评论
6
9
分享
牛客网
牛客企业服务