1 条题解
-
0
📝 题目大意
有 个人按顺序排队购票,每人购票需要 秒。第 个人在 秒时到达队尾(若队伍为空则立即开始购票)。求每个人购票完成的时刻。
💡 解题思路
-
题目分析:题目本质是一个模拟问题,需要按顺序处理每个人的到达和购票过程。关键约束是 严格递增,且 ,数据范围很小,直接模拟即可。
-
算法推导:
- 维护一个变量
current_time,表示上一个人购票完成的时刻(即售票窗口空闲的时刻)。 - 对于第 个人,其开始购票的时刻 = :
- 如果 ,说明他到达时队伍已空,可以直接开始,开始时刻为 。
- 否则,他到达时前面还有人,需要排队等待,开始时刻为 (即上一个人刚完成,他立刻开始)。
- 第 个人完成的时刻 = 开始时刻 ,将这个值更新为新的
current_time并输出。 - 这个模拟过程天然保证了每个人按顺序、不间断地购票,与 std.cpp 的逻辑完全一致。
- 维护一个变量
-
边界与细节:
- 初始时
current_time = 0,第一个人到达时若 ,则current_time直接取 ;若 ,同理。 - 和 最大可达 ,最终结果可能超过 ,但仍在
int范围内(,最坏情况约 ,不会溢出 32 位有符号整数)。
- 初始时
⏱️ 复杂度分析
- 时间复杂度:。只需对 个人各进行一次常数时间的判断和更新操作。
- 空间复杂度:。需要存储 个到达时间(
T数组),除此之外仅使用常数个变量。
💻 标准代码 (C++)
#include <iostream> #include <vector> using namespace std; int main() { int N, A; cin >> N >> A; vector<int> T(N); for (int i = 0; i < N; i++) { cin >> T[i]; // 读入每个人的到达时间 } int current_time = 0; // 售票窗口空闲的时刻(即上一个人完成购票的时刻) for (int i = 0; i < N; i++) { if (T[i] > current_time) { // 到达时队伍已空,可以直接开始 current_time = T[i]; // 开始时刻 = 到达时刻 } // 否则 T[i] <= current_time,说明需要排队,开始时刻 = current_time(不变) current_time += A; // 购票耗时 A 秒,更新完成时刻 cout << current_time << endl; // 输出第 i 个人的完成时刻 } return 0; } -
- 1
信息
- ID
- 802
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- (无)
- 递交数
- 1
- 已通过
- 1
- 上传者