【题解】感应门
【题目描述】
感应门会在有人经过的时候自动打开,冷却d 秒后自动关闭。如果有人在感应门打开的状态下通过,那么冷却时间会重置,重新冷却d秒后再关闭。
在一段时间内,有 n个人陆续通过了感应门,他们通过感应门的时间点分别是t1,t2,⋯,tn,请计算感应门一共开放了多少时间。
【输入描述】
第一行:两个整数n与d,n表示通过感应门的人数,d表示感应门的冷却时间。
第二行:n个整数t1,t2,⋯,tn,每个数字表达一个人通过感应门的时间点。
【输出描述】
单个整数,表示感应门总共开启了多少时间。
【样例输入】
7 3 1 2 7 10 15 17 22
【样例输出】
18
【数据范围】
对于 50% 的数据,1≤n≤1000; 对于 100% 的数据,1≤n≤100,000; 1≤t1≤t2≤t3≤⋯≤tn≤1,000,000,000; 1≤d≤1,000,000,000。
【题目分析】
生活中的感应门,如果长时间没有人走过,那么就会关闭,如果中间有人走过,那么就一直保持开启状态,直到没有人经过。
每次有人经过门,就会重置关闭时间。
如果当前的人和前一个人经过门的时间大于等于d,那么就冷却d秒关闭。如果没有大于等于d秒,那么时间就被重置
对于样例来说,7个人,经过门的时间分别是1 2 7 10 15 17 22。
门冷却时间是3秒。
```
如果有人的时间点,首先将第一个人的时间点算进去。
遍历每个人的时间点:
如果当前时间大于等于上次门关闭的时间,则表示门已经关闭,增加
d
到总开启时间。如果当前时间小于上次门关闭的时间,则表示门仍然开启,增加当前时间和上次时间的差值到总开启时间。
更新感应门的关闭时间为当前人的通过时间加
d
【参考代码】
#include <bits/stdc++.h> using namespace std; int times[10000]; int main() { int n, d; cin >> n >> d; for (int i = 0; i < n; i++) { cin >> times[i]; } // 计算感应门总共开启时间 int total_open_time = 0; if (n > 0) { int end_time = times[0] + d; // 第一个人经过时感应门会打开并计算关闭时间 total_open_time = d; for (int i = 1; i < n; i++) { if (times[i] >= end_time) { total_open_time += d; // 如果两人经过的时间间隔大于等于d,感应门会重新冷却 } else { total_open_time += times[i] - times[i - 1]; // 否则感应门保持打开状态 } end_time = times[i] + d; // 更新关闭时间 } } cout << total_open_time << endl; return 0; }
(adsbygoogle = window.adsbygoogle || []).push({});