字节5.6笔试 客户端题解

第一题
buff总共持续时间,新buff会重置旧buff
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int main() {
    int n;
    cin >> n;
    vector<pair<int, int>> pa(n);
    for (int i = 0; i < n; ++i) {
        cin >> pa[i].first;
    }
    for (int i = 0, tmp; i < n; ++i) {
        cin >> tmp;
        pa[i].second = pa[i].first + tmp - 1;
    }
    sort(pa.begin(), pa.end());
    int res = 0;
    int start = pa[0].first, last = pa[0].second;
    for (int i = 1; i < n; ++i) {
        if (last < pa[i].first) {
            res += last - start + 1;
        }
        else {
            res += pa[i].first - start;
        }
        start = pa[i].first;
        last = pa[i].second;
    }
    res += last - start + 1;
    cout << res;
}


第二题
有效数字集,匹配数字前缀成功即有效
主要会有溢出问题,用long long
#include <iostream>
#include <vector>
#include <unordered_set>
using namespace std;
using ll = long long ;

int main () {
    int N;
    cin >> N;
    for (int i = 0; i < N; ++i) {
        unordered_set<ll> mset;
        int T;
        cin >> T;
        vector<ll> data(T);
        for (int j = 0; j < T; ++j) {
            cin >> data[j];
            mset.insert(data[j]);
        }
        bool flag = false;
        for (int j = 0; j < T; ++j) {
            ll val = data[j] / 10;
            while (val) {
                if (mset.count(val)) {
                    flag = true;
                    break;
                }
                else {
                    val /= 10;
                }
            }
            if (flag) break;
        }
        if (flag) cout << "YES" << endl;
        else cout << "NO" << endl;
    }
}

第三题
完成两个任务,总共可支配时间m,给出n个任务,求能完成的最大价值
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int main() {
    int n, m;
    cin >> n >> m;
    vector<pair<int, int>> pa(n);
    for (int i = 0; i < n; ++i) {
        cin >> pa[i].second >> pa[i].first; //时间 价值
    }
    sort(pa.rbegin(), pa.rend());//按照价值降序
    int res = 0;
    for (int i = 0; i < n; ++i) {
        if (pa[i].second >= m) continue;
        int tmpSum = 0;
        for (int j = i + 1; j < n; ++j) {
            tmpSum = pa[i].first + pa[j].first;
            if (tmpSum <= res) break;
            if (pa[i].second + pa[j].second <= m) res = max(res, tmpSum);
        }
    }
    cout << res;
}



第四题,
删除一个连续子数组,求新数组的最大严格上升子数组
只过了35,求大佬补充
#实习##笔试题目##C/C++##字节跳动#
全部评论
第三题可以用最大堆进行优化,遍历数组所有数,当前堆里的所有数用时必定比当前的时间小,每次取堆顶(元素价值最大的)进行检查,如果这个最大的用时和当前的用时超过限制就出队,直到找到第一个满足条件的,则res=max(res, arr[i].time+q.top().time),然后把当前数插入堆里,如此往复
点赞 回复 分享
发布于 2022-05-06 14:07
第四题我只写了个n2的动归,过了40,应该可以优化成nlogn,思路是把上升子序列分为两种情况的的dp,一种是断开的上升子序列(也就是有删除一次子数组的),一种是连续的上升子序列 记dp[i][0]代表以下标i的元素为结尾的连续上升子序列 记dp[i][1]代表以下标i的元素为结尾的断开的上升子序列 所有dp[i][0]和dp[i][1]都初始化为1 对于 i - 1 if arr[i] > arr[i-1]: dp[i][0] = dp[i-1][0] + 1 对于 j < i if arr[i] > arr[j]: dp[i][1] = dp[j][0] + 1
点赞 回复 分享
发布于 2022-05-06 14:16
第四题只过了30,等大佬
点赞 回复 分享
发布于 2022-05-06 14:24
第四题:预处理+树状数组+离散化
点赞 回复 分享
发布于 2022-05-06 22:05

相关推荐

喜欢走神的孤勇者练习时长两年半:爱华,信华,等华,黑华
点赞 评论 收藏
分享
7 18 评论
分享
牛客网
牛客企业服务