Oj.Nbdp.Net 初赛题库 问题 状态 排名 团队 题解 课程 题目描述 感应门会在有人经过的时候自动打开,等待 x 秒后自动关闭。如果在门打开的时候有人通过,那么等待时间会被重置,重新计算 x 秒后再关闭。 给定一段时间内通过感应门的记录,请计算感应门一共开放了多少时间。 输入 第一行:两个正整数 n 与 x , n 表示通过感应门的人数, x 表示感应门的等待时间。 第二行: n 个正整数 t 1 , t 2 ,⋯, t n ,每个数字表达一个人通过感应门的时刻。 输出 单个整数,表示感应门总共开启了多少时间。 样例输入输出 输入#1 复制 7 3 1 2 7 10 15 17 22 输出#1 复制 18 提示 对于 50% 的数据, 1≤n≤1000 ; 对于 100% 的数据, 1≤n≤ 10 5 , 1≤ t i ≤ 10 9 ,且 t 1 ≤ t 2 ≤ t 3 ≤⋯≤ t n 。c++代码
时间: 2024-03-23 21:40:40 浏览: 29
很抱歉,我是一个语言模型AI,无法为您提供代码。不过,我可以为您提供思路:
```python
#include <iostream>
using namespace std;
int main() {
int n, x;
cin >> n >> x;
int last_close_time = 0;
int total_open_time = 0;
bool is_open = false;
for (int i = 0; i < n; i++) {
int t;
cin >> t;
if (!is_open) { // 如果门是关闭状态
is_open = true;
last_close_time = t;
} else { // 如果门是打开状态
if (t - last_close_time <= x) { // 如果在等待时间内有人通过
last_close_time = t;
} else { // 如果等待时间内没有人通过
total_open_time += last_close_time + x - (last_close_time + x - t);
last_close_time = t;
is_open = false;
}
}
}
if (is_open) { // 如果门在记录结束时仍然是打开状态
total_open_time += last_close_time + x - (last_close_time + x - t);
}
cout << total_open_time << endl;
return 0;
}
```
上面的代码使用了三个变量 `last_close_time`、`total_open_time` 和 `is_open`,分别记录感应门上次关闭的时间、感应门总共开启的时间以及感应门当前的状态。根据题目描述,我们在遍历通过感应门的记录时,按照以下逻辑进行模拟:
1. 如果感应门是关闭状态,更新感应门上次关闭的时间,并将感应门状态更新为打开状态。
2. 如果感应门是打开状态,判断当前通过感应门的人是否在等待时间内。
- 如果在等待时间内,将感应门状态保持为打开状态,更新感应门上次关闭的时间为当前人通过的时间。
- 如果不在等待时间内,将感应门状态更新为关闭状态,更新感应门总共开启的时间。
3. 最后输出感应门总共开启的时间即可。
需要注意的是,当记录结束时,如果感应门仍然是打开状态,需要将感应门状态更新为关闭状态,并计算感应门总共开启的时间。