[12月考试] C
[12月考试] C
题目描述
小 E 正在洗澡,假设热水器是只存放热水的容器,洗澡每分钟都会消耗热水,同时热水器的加热功能每分钟都会给容器新增热水。
热水器的容量为 nnn 升,每分钟可以新增 mmm 升热水,小 E 需要洗 kkk 分钟,第 iii 分种消耗 aia_iai 升热水。
假设热水是在每分钟初被消耗,每分钟末被新增。如果原有热水加上新增的 mmm 升热水超过容量 nnn,会将热水器的水量填补为容量 nnn。
请问小 E 能否洗完澡。如果可以,输出 Poppin' Shower
;如果不可以,输出小 E 在第几分钟初没有热水可以消耗。
对于所有数据,k≤100k\leq 100k≤100,n,m,ai≤109n,m,a_i\leq 10^9n,m,ai≤109。
输入格式
输入共 222 行。
第 111 行输入 333 个正整数 n,m,kn,m,kn,m,k。
第 222 行输入 kkk 个正整数 a1,a2,…,aka_1,a_2,\ldots,a_ka1,a2,…,ak。
输出格式
输出共 111 行 111 个正整数或字符串,表示答案。
样例 #1
样例输入 #1
10 1 5
9 2 2 1 1
样例输出 #1
3
样例 #2
样例输入 #2
10 2 5
9 2 2 1 1
样例输出 #2
Poppin' Shower
样例 #3
样例输入 #3
10 9 5
1 1 1 1 100
样例输出 #3
5
提示
数据范围
对于 30%30\%30% 的数据,k≤3k\leq 3k≤3。
对于所有数据,k≤100k\leq 100k≤100,n,m,ai≤109n,m,a_i\leq 10^9n,m,ai≤109。
这是一道典型的模拟类问题,只要正确实现每分钟的消耗和加热过程即可。
🧠题目简化
我们维护一个变量 cur
表示当前热水器中的热水量(初始为满,即 n
升)。
对于每一分钟 i=1→ki = 1 \to ki=1→k:
- 分钟初,小 E 需要消耗 aia_iai 升热水。
- 若
cur < a[i]
,表示水不够用,输出 i(分钟数),程序结束。 - 否则,
cur -= a[i]
。
- 若
- 分钟末,热水器加热 mmm 升热水:
cur += m
- 若
cur > n
,则:cur = n
✅算法流程(模拟)
- 初始化当前水量
cur = n
- 遍历每分钟 i=1→ki = 1 \to ki=1→k:
- 若
cur < a[i]
,输出i
(第几分钟失败),退出 - 否则:
cur -= a[i]
cur += m
cur = min(cur, n)
- 若
- 如果循环正常结束,说明全程水够,输出
Poppin' Shower
✅代码实现(C++)
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;int main() {long long n, m;int k;cin >> n >> m >> k;vector<long long> a(k);for (int i = 0; i < k; ++i) cin >> a[i];long long cur = n; // 当前水量for (int i = 0; i < k; ++i) {if (cur < a[i]) {cout << i + 1 << endl; // 第 i+1 分钟失败return 0;}cur -= a[i];cur += m;if (cur > n) cur = n;}cout << "Poppin' Shower" << endl;return 0;
}