百度笔试-算法A卷

1. 通关 AC
题目大概意思:两个数组和一个t, 选择和不超过t的最大个数
思路:构建两者前缀和,遍历小的一个,对于另一个数组二分查找位置,记录maxn
#include <iostream>
#include <vector>
#include <algorithm>
#include <climits>
using namespace std;
typedef long long ll;
int main() {
    int n, m, t;
    cin >> n >> m >> t;
    vector<ll> g1(n+1), g2(m+1);
    for(int i = 1; i <= n; i++) {
       cin >> g1[i];
       g1[i] += g1[i - 1];
    }
    for(int j = 1; j <= m; j++) {
      cin >> g2[j];
      g2[j] += g2[j - 1];
    }
    g1.push_back(LONG_MAX);
    g2.push_back(LONG_MAX);
    ll max_cnt = 0;
    for(int i = 0; i <= g1.size() && g1[i] <= t; i++) {
        int cnt;
        int idx = lower_bound(g2.begin(), g2.end(), t - g1[i]) - g2.begin();
        if(idx < g2.size() && g2[idx] == t - g1[i]) {
           cnt = i + idx;
        } else {
           cnt = i + idx - 1;
        } max_cnt = max(max_cnt, cnt);
    }
    cout << max_cnt;
    return 0;
}
2. AC
// 给数组排m次序
// 输入一 n 个数组成的数组,进行了m次操作
// 每次操作由 a b 两个数定义
// a==1 表示把数组的前 b 个数从小到大排序
// a==2 表示把数组的前 b 个数从大到小排序。
// 输出m次操作后的数组
// 1≤n,m≤2x1e5
// n个整数属于 [-1e9,1e9]范围
// 1≤a≤2,1≤b≤n
// 输出描述
//
// 输入
// 4 2  (n、m)
// 1 2 4 3 (n个数)
// 2 3 (第一次操作,得到 4 2 1 3)
// 1 2 (第二次操作)
// 输出
// 2 4 1 3

思路:单调栈,发现如果对于操作 i j,操作j位于操作i之后,并且ki < kj,那么kj可以覆盖ki,因此无需操作ki
#include <queue>
#include <iostream>
#include <algorithm>
using namespace std;
struct node {
    int t, k;
    node(int _t, int _k):t(_t), k(_k) {}
};

int main() {
    int n, m;
    cin >> n >> m;
    vector<int> nums(n);
    for(int i = 0; i < n; i++) cin >> nums[i];
    deque<node> dq;
    int t, k;
    for(int i = 0; i < m; i++) {
        cin >> t >> k;
        while(!dq.empty() && dq.back().k < k) {
            dq.pop_back();
        }
        dq.emplace_back(t, k);
    }
    for(auto& it: dq) {
        if(it.t == 1) {
            sort(nums.begin(), nums.begin() + it.k);
        } else {
            sort(nums.begin(), nums.begin() + it.k, greater<int>());
        }
    }
    for_each(nums.begin(), nums.end(), [&](int &num){cout << num << " ";});
    return 0;
}



#百度笔试##百度笔试机器学习##百度算法笔试##百度23秋招笔试编程题有点儿简单啊#
全部评论
第二题只需要排序一次即可,后续不同人操作的时候直接翻转数组就行。
点赞 回复 分享
发布于 2022-09-14 08:51 北京
同学同花顺尝试一下吗,面试简单不造火箭,我帖子有内推
点赞 回复 分享
发布于 2022-09-14 09:01 浙江
hi~同学,秋招遇“寒气”,牛客送温暖啦!23届秋招笔面经有奖征集中,参与就得牛客会员7天免费体验,最高赢300元京东卡!戳我去看>>>https://www.nowcoder.com/link/zhengjipinglun
点赞 回复 分享
发布于 2022-09-16 14:23 北京
第二题感觉这个做法能过也是数据有点水,构造一组k递减的数据,这样哪怕只排序一次也是n方的复杂度
点赞 回复 分享
发布于 2022-09-18 12:20 江苏

相关推荐

8 14 评论
分享
牛客网
牛客企业服务