本题为简单的模拟题,注意细节

核心思路

核心观察

  1. 顺序固定:必须从第 0 题到第 n-1 题依次决策,贪心模拟即可
  2. 无后效性:当前是否做题只取决于剩余时间,不影响后续策略。
  3. 独立计算:clccle 和 rqy 的规则互不影响,可分别模拟。

算法步骤

模拟 clccle

  • 初始化 rem1 = t, cnt1 = 0
  • 遍历每道题 i = 0 to n-1
    • diffs[i] >= a → 跳过
    • 否则:
      • rem1 >= times[i]rem1 -= times[i], cnt1++
      • 否则 → 跳过(且后续也无法做,但继续遍历不影响)

模拟 rqy

  • 初始化 rem2 = t, cnt2 = 0
  • 遍历每道题 i = 0 to n-1
    • 计算耗时 cost = (diffs[i] >= b) ? 2 * times[i] : times[i]
    • rem2 >= costrem2 -= cost, cnt2++
    • 否则 → 跳过

正确性分析

  • clccle 的跳过逻辑:题目明确“难度高直接跳”,且“时间不够也跳”,符合模拟。
  • rqy 的跳过逻辑:她不会主动跳过难题,只有时间不够才跳,因此对每道题都尝试做(只要时间够)。
  • 顺序约束:题目强调“按给定顺序刷”,故不能排序或选做,必须顺序遍历。

复杂度分析

  • ==时间复杂度==: 仅两次线性扫描。

  • ==空间复杂度==:
    存储时间和难度数组(可优化为 流式读入,但本题 n 不大)。

代码

#include <bits/stdc++.h>
using namespace std;

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int n;
    long long t;
    cin >> n >> t;

    long long a, b;
    cin >> a >> b;

    vector<long long> times(n), diffs(n);
    for (int i = 0; i < n; ++i) cin >> times[i];
    for (int i = 0; i < n; ++i) cin >> diffs[i];

    // clccle: 难度 >= a 直接跳;否则看时间
    long long rem1 = t;
    int cnt1 = 0;
    for (int i = 0; i < n; i++) {
        if (diffs[i] >= a) continue;
        if (rem1 >= times[i]) {
            rem1 -= times[i];
            cnt1++;
        }
    }

    // rqy: 难度 >= b 花 2*time,否则花 time;只因时间不够才跳
    long long rem2 = t;
    int cnt2 = 0;
    for (int i = 0; i < n; i++) {
        long long cost = (diffs[i] >= b) ? 2 * times[i] : times[i];
        if (rem2 >= cost) {
            rem2 -= cost;
            cnt2++;
        }
    }

    cout << cnt1 << " " << cnt2 << "\n";
    return 0;
}