嘘~ 正在从服务器偷取页面 . . .

洛谷P2107 小Z的AK计划 题解


洛谷P2107 小Z的AK计划 题解

题目链接:P2107 小Z的AK计划

题意

在小 Z 的家乡,有机房一条街,街上有很多机房。每个机房里都有一万个人在切题。小 Z 刚刷完 CodeChef,准备出来逛逛。

机房一条街有 \(n\) 个机房,第 \(i\) 个机房的坐标为 \(x_i\) ,小 Z 的家坐标为 \(0\)。小 Z 在街上移动的速度为 \(1\),即从 \(x_1\)\(x_2\) 所耗费的时间为 \(|x_1 - x_2|\)

每个机房的学生数量不同,ACM 题目水平也良莠不齐。小 Z 到达第 \(i\) 个机房后,可以花 \(t_i\) 的时间想题,然后瞬间 AK;当然,也可以过机房而不入。

小 Z 现在只有 \(m\) 个单位时间,之后他就该赶着去打 Codeforces 了。现在他想知道自己最多能在多少个机房 AK,希望你帮帮他。

输入格式

第一行包含两个整数 \(n,m\)

接下来 \(n\) 行,每行包含两个整数 \(x_i,t_i\)

输出格式

第一行包含一个整数,表示小 Z 最多能 AK 的机房数量。

数据范围

\(1 \leq n \leq 10^5\)\(0 \leq m,x_i \leq 10^{18}\)\(0 \leq t_i \leq 10^9\)

考虑反悔贪心即可,每次直接选

发现时间不够选了,就把之前耗时最高的一个个扔掉。

时间复杂度 \(\mathcal{O}(n)\)

代码:

#include <bits/stdc++.h>
using namespace std;
#define int long long
#define INF 0x3f3f3f3f3f3f3f3f
void up(int &x, int y) { x < y ? x = y : 0; }
void down(int &x, int y) { x > y ? x = y : 0; }
#define rep(i, a, b) for(int i = (a), i##END = (b); i <= i##END; i++)
#define Rep(i, a, b) for(int i = (a), i##END = (b); i >= i##END; i--)
#define N ((int)(1e5 + 15))

struct node { int x, t; } a[N];
priority_queue<int> q;
signed main()
{
    ios::sync_with_stdio(0);
    cin.tie(0); cout.tie(0);
    // freopen("check.in","r",stdin);
    // freopen("check.out","w",stdout);
    int n, m; cin >> n >> m;
    rep(i, 1, n) cin >> a[i].x >> a[i].t;
    sort(a + 1, a + 1 + n, [&](node a, node b) { return a.x < b.x; });
    int tim = 0, res = 0, cnt = 0;
    rep(i, 1, n)
    {
        tim += a[i].x - a[i - 1].x;
        q.push(a[i].t); ++cnt; tim += a[i].t;
        while(!q.empty() && tim > m) { --cnt; tim -= q.top(); q.pop(); }
        if(tim > m) break; else up(res, cnt);
    }
    cout << res << '\n';
    return 0;
}

参考文献

[1] https://www.luogu.com.cn/article/0kd7zqe7


文章作者: q779
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-ND 4.0 许可协议。转载请注明来源 q779 !
评论
  目录