本题为简单的模拟题,注意细节
核心思路
核心观察
- 顺序固定:必须从第 0 题到第 n-1 题依次决策,贪心模拟即可。
- 无后效性:当前是否做题只取决于剩余时间,不影响后续策略。
- 独立计算: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 >= cost→rem2 -= 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;
}

京公网安备 11010502036488号