けんちょんの競プロ精進記録

競プロの精進記録や小ネタを書いていきます

AtCoder ABC 367 A - Shout Everyday (6Q, 灰色, 150 点)

ややこしいけど、落ち着いて考えればできる!

問題概要

AtCoder 王国の住民は  A 時になるとたこ焼きへの愛を叫ぶことになっている。

AtCoder 王国に住む高橋君は毎日  B 時に就寝し  C 時に起床する。

高橋君はたこ焼きへの愛を叫ぶことができているかどうかを判定せよ。

制約

  •  0 \le A, B, C \lt 24
  •  A, B, C は相異なる

考えたこと

 A 時が寝ている最中かどうかを考えよう。ここで、 B \lt C B \gt C かに分けて考えることにする。このどちらなのかによって、「寝ている間に 0 時を跨ぐかどうか」が変わるからだ。

次のように整理できる。


  •  B \lt C のとき:日をまたがないので、寝ている時間は  B 以上  C 以下の時刻である。
    • よって、求める条件は「 A \lt B または  C \lt A
  •  B \gt C のとき:日をまたぐので、寝ている時間は「 B 以上  24 未満」と「 0 以上  C 以下」の時刻である。
    • よって、求める条件は「 C \lt A かつ  A \le B

あとは、これを実装すれば AC となる。

コード

#include <bits/stdc++.h>
using namespace std;

int main() {
    int A, B, C;
    cin >> A >> B >> C;

    if (B < C) {
        if (A < B || C < A) cout << "Yes" << endl;
        else cout << "No" << endl;
    } else {
        if (C < A && A < B) cout << "Yes" << endl;
        else cout << "No" << endl;
    }
}