题解 | #请客吃饭#

请客吃饭

https://www.nowcoder.com/practice/4250a369235e414ba9128bb23ff4fcf5

二分答案+滑动窗口

我们来看看为什么可以想出这个思路

首先我们假设所有的人都是数轴上的点,他们的坐标就是 a ,权值就是 b

对于一个隔阂值 m ,代表在数轴上选择一段长度为 m 的区间,区间里点的权值和就是贡献

那么这个区间就是滑动窗口,他的右端点一定在一个点上,因为从贪心的角度来看,如果右端点不在一个点上,那么我们可以把右端点向左移动,这样就可能会覆盖其他点,权值和就可能会增加

我们可以遍历维护出这个窗口,每次向右滑动到一个新的点,这时窗口中已经存在的点可能会离开窗口,但是一定是最左边的点离开,所以我们可以用一个双端队列来维护,同时记录最大的权值和,如果大于等于 k ,代表这个 m 是合法的

然后我们发现 m 是单调的,假设最终的答案是 M ,那么对于任意的 m >= M ,其权值和都是大于等于 k 的,也都是合法的,对于任意的 m < M ,其权值和都是小于 k 的,也都是不合法的,所以我们可以二分答案

#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 2e5 + 5;
int __t = 1, n, k, a, b;
vector<pair<int, int>> v;
int ck(int m) {
    deque<pair<int, int>> q;
    int sum = 0, ma = 0;
    for (auto [a, b] : v) {
        q.push_back({a, b}), sum += b;
        while (!q.empty() && q.front().first < a - m)
            sum -= q.front().second, q.pop_front();
        ma = max(ma, sum);
    }
    return ma >= k;
}
void solve() {
    cin >> n >> k;
    v.resize(n);
    for (int i = 0; i < n; i++)
        cin >> v[i].first;
    for (int i = 0; i < n; i++)
        cin >> v[i].second;
    sort(v.begin(), v.end());
    int l = 0, r = 1e9;
    while (l < r) {
        int m = (l + r) / 2;
        if (ck(m))
            r = m;
        else
            l = m + 1;
    }
    cout << (l == 1e9 ? -1 : l) << '\n';
    return;
}
int32_t main() {
#ifdef ONLINE_JUDGE
    ios::sync_with_stdio(false);
    cin.tie(0);
#endif
    // cin >> __t;
    while (__t--)
        solve();
    return 0;
}

全部评论

相关推荐

评论
2
1
分享

创作者周榜

更多
正在热议
更多
# 春招至今,你的战绩如何? #
5306次浏览 49人参与
# 你的实习产出是真实的还是包装的? #
1145次浏览 29人参与
# 米连集团26产品管培生项目 #
4300次浏览 203人参与
# 军工所铁饭碗 vs 互联网高薪资,你会选谁 #
6948次浏览 37人参与
# 简历第一个项目做什么 #
31265次浏览 313人参与
# 当下环境,你会继续卷互联网,还是看其他行业机会 #
186393次浏览 1115人参与
# 巨人网络春招 #
11192次浏览 223人参与
# 研究所笔面经互助 #
118756次浏览 577人参与
# 面试紧张时你会有什么表现? #
30389次浏览 188人参与
# 简历中的项目经历要怎么写? #
309413次浏览 4154人参与
# AI时代,哪些岗位最容易被淘汰 #
62474次浏览 733人参与
# 网易游戏笔试 #
6328次浏览 83人参与
# 职能管理面试记录 #
10700次浏览 59人参与
# 把自己当AI,现在最消耗你token的问题是什么? #
6885次浏览 154人参与
# 从哪些方向判断这个offer值不值得去? #
56700次浏览 357人参与
# 你怎么看待AI面试 #
179298次浏览 1167人参与
# 腾讯音乐求职进展汇总 #
160405次浏览 1105人参与
# 小红书求职进展汇总 #
226860次浏览 1356人参与
# 正在春招的你,也参与了去年秋招吗? #
362579次浏览 2631人参与
# 你的房租占工资的比例是多少? #
92126次浏览 896人参与
# 校招笔试 #
466603次浏览 2951人参与
# 机械求职避坑tips #
94401次浏览 567人参与
牛客网
牛客网在线编程
牛客网题解
牛客企业服务