Official

B - Shout Everyday Editorial by toam


初心者の方へ

高橋君が寝ているときに日をまたぐかどうかで場合分けすることで解くことができます.

[1] 日をまたがない場合

高橋君は同じ日に就寝し起床するため,\(B<C\) が成り立ちます.寝ている時間は \(B\) 時から \(C\) 時なので,その間に \(A\) 時がある場合,すなわち \(B<A<C\) のときは答えは No です.そうでない場合は答えは Yes です.

[2] 日をまたぐ場合

一日の中では高橋君は先に起床し,その後就寝するため \(C<B\) が成り立ちます.起きている時間は \(C\) 時から \(B\) 時なので,その間に \(A\) 時がある場合,すなわち \(C<A<B\) のときは答えは Yes です.そうでない場合は No です.

実装例(Python)

A, B, C = map(int, input().split())
if B < C:
    if B < A < C:
        print("No")
    else:
        print("Yes")
else:
    if C < A < B:
        print("Yes")
    else:
        print("No")

実装例(C++)

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

int main()
{
  int A, B, C;
  cin >> A >> B >> C;
  if (B < C)
  {
    if (B < A && A < C)
      cout << "No" << endl;
    else
      cout << "Yes" << endl;
  }
  else
  {
    if (C < A && A < B)
      cout << "Yes" << endl;
    else
      cout << "No" << endl;
  }
}

このような場合分けが多い問題において,場合分けを使わない方法があるときは,場合分けの漏れやミスによるペナルティを回避することができるため有効な手段となることがあります.

本問題においては,while 文を使うことで場合分けを回避することができます.\(B\) 時から時間を進めていき,\(C\) 時になるまでに \(A\) 時と一致するならば No 出力し,そうでないならば Yes を出力すればよいです.

実装例 (Python)

A, B, C = map(int, input().split())
now = B
while now != C:
    if now == A:
        print("No")
        exit()
    now += 1
    now %= 24

print("Yes")

posted:
last update: