1 条题解
-
0
📝 题目大意
有 个团体排队等待乘坐容量为 的游乐设施。按队列顺序依次处理每个团体:若当前剩余空位足够容纳该团体则让其入座,否则启动设施(清空空位)后再让其入座。所有团体处理完毕后,若设施内还有人则需额外启动一次。求总共启动设施的次数。
💡 解题思路
-
题目分析:
- ,数据范围极小,直接模拟即可。
- 每个团体人数 ,保证单个团体一定能被容纳,不会出现死循环。
- 团体按队列顺序处理,不能重排,属于典型的贪心模拟题。
-
算法推导:
- 维护两个变量:
space表示当前设施剩余空位数(初始为 ),start_count记录启动次数(初始为 )。 - 遍历每个团体 :
- 若 :当前团体能坐下,直接
space -= A_i。 - 否则:当前团体坐不下,必须启动设施。
start_count++,然后空位重置为 并安排当前团体:space = K - A_i。
- 若 :当前团体能坐下,直接
- 遍历结束后,若
space < K(即设施内还有人),需要再启动一次:start_count++。 - 最后输出
start_count。
- 维护两个变量:
-
边界与细节:
- 当 且
space = K时,能够坐下,space变为 ,不会触发启动。 - 当 时同理,刚好坐满,不触发启动。
- 最后一趟若设施内有人(
space < K),需要补一次启动,这是容易遗漏的 WA 点。 - 时,团体入座后
space < K,需要额外启动一次,答案为 。
- 当 且
⏱️ 复杂度分析
- 时间复杂度:,只需一趟线性扫描。
- 空间复杂度:(存储数组 )或 (边读边处理)。
💻 标准代码 (C++)
#include <iostream> #include <vector> using namespace std; int main() { int N, K; cin >> N >> K; vector<int> A(N); for (int i = 0; i < N; i++) { cin >> A[i]; } int space = K; // 当前设施剩余空位数 int start_count = 0; // 启动次数计数器 for (int i = 0; i < N; i++) { if (A[i] <= space) { // 当前团体能坐下,直接入座 space -= A[i]; } else { // 坐不下,启动设施,清空空位后安排当前团体 start_count++; space = K - A[i]; } } // 最后一趟若设施内还有人,需要额外启动一次 if (space < K) { start_count++; } cout << start_count << endl; return 0; } -
- 1
信息
- ID
- 797
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- (无)
- 递交数
- 1
- 已通过
- 1
- 上传者