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 14:40:21 浏览: 71
acm.rar_oj题目含题解_明代zjuoj
这是一道简单的模拟题,需要按照题意模拟门的开启和关闭过程。可以用一个变量记录门是否处于开启状态,另一个变量记录门上一个关闭的时刻。对于每个通过门的人,计算其通过门的时间与上一个关闭时刻之差,如果小于等于$x$,则门的等待时间被重置为$x$,否则门将在原有等待时间$x$的基础上再等待$x$秒。同时,每次门开启时需要累加门开启的时间。最后累加所有门开启的时间即可得到答案。
以下是C++的参考代码:
```c++
#include <iostream>
using namespace std;
int main() {
int n, x;
cin >> n >> x;
int last_close = 0, open_time = 0;
bool is_open = false;
for (int i = 0; i < n; i++) {
int t;
cin >> t;
if (!is_open) { // 门处于关闭状态
is_open = true;
open_time += x;
} else { // 门处于开启状态
int diff = t - last_close;
if (diff <= x) {
open_time += (x - diff);
} else { // 重置等待时间
open_time += x;
}
}
last_close = t;
}
if (is_open) { // 最后一次门开启的时间需要特判
open_time += x;
}
cout << open_time << endl;
return 0;
}
```
阅读全文