【AtCoder】ABC 185 B - Smartphone Addiction

B - Smartphone Addictionatcoder.jp favicon

実行時間制限: 2 sec / メモリ制限: 1024 MiB / Difficulty: 93 / NoviSteps: 6Q / 配点: 200 点

問題概要

高橋君のスマートフォンのバッテリー容量は NN [mAh] であり、n+0.5 (nn + 0.5\,(n は整数)) を迎える度にバッテリー残量が 11 [mAh] ずつ減少する。

高橋君はスマートフォンを満充電した状態で時刻 00 に外出し、途中で MM 回カフェを訪れ、時刻 TT に帰宅する。

ii 回目に訪れるカフェには時刻 AiA_i から時刻 BiB_i まで滞在する。 カフェに滞在している間はスマートフォンを充電するため、バッテリー残量は減少せず、代わりに時刻 n+0.5 (nn + 0.5\,(n は整数)) を迎える度に 11 [mAh] ずつ増加する。 ただし、既にバッテリー残量がバッテリー容量と等しい場合、バッテリー残量はそれ以上増加しない。

高橋君が途中でスマートフォンのバッテリー残量が 00 になることなく帰宅することができるかを判定せよ。

制約

  • 1≤N≤1091 \le N \le 10^9
  • 1≤M≤10001 \le M \le 1000
  • 1≤T≤1091 \le T \le 10^9
  • 0<A1<B1<A2<B2<A3<B3<⋯<AM<BM<T0 \lt A_1 \lt B_1 \lt A_2 \lt B_2 \lt A_3 \lt B_3 \lt \dots \lt A_M \lt B_M \lt T
  • 入力は全て整数

考察

時間を進めながら、スマートフォンのバッテリーの残量をシミュレーションすればよい。

最後のカフェから帰宅までの時間を忘れないようにすること。

実装例

CPP
1.#include <bits/stdc++.h>
2.using namespace std;
3.
4.// ======================================== //
5.
6.int main()
7.{
8. int N, M, T;
9. cin >> N >> M >> T;
10.
11. int now = N, time = 0;
12. while (M--)
13. {
14. int A, B;
15. cin >> A >> B;
16.
17. now -= A - time;
18. time = A;
19. if (now <= 0) {
20. cout << "No" << endl;
21. return 0;
22. }
23.
24. now = min(N, now + (B - A));
25. time = B;
26. }
27.
28. now -= T - time;
29. time = T;
30. if (now <= 0) {
31. cout << "No" << endl;
32. return 0;
33. }
34.
35. cout << "Yes" << endl;
36.
37. return 0;
38.}
atcoder.jp favicon

実装時間: 5 分

コメント

+0.5+0.5 の時刻が出てくると身構えてしまう。