A - 帰省 (Homecoming) Editorial by TumoiYorozu


この解説は、C++ に入門したばかりの中高生レベルを想定して、考察の方法、コードの書き方の解説をします。

問題の考察

ビ太郎がビバ子に会えるための必要十分条件は \(A \leqq C < B\) である。したがって、if 文などを用いてこれを判定すればよい。

C++での書き方

考察を読んで解き方にピンと来たら、試してみよう! もっとヒントが欲しいときはここをクリックして開いてね

C++ では、$\leqq$ は `<=` を使って比較をする。

式のとおりに条件式を書くと `A <= C < B` になるが、C++ では比較演算子は 2 つの値の比較しかできないので、3つの値を連続して比較することはできない。

このときは、`A<=C` かつ `C < B` と、 2 つの値の比較を2回行う事で解決できる。C++ で 『かつ』は `&&` を使う。

よって、`A<=C && C < B` とすると、条件式を作ることが出来る。

解答コード

コード例 (実際の提出のリンクはこちら)

#include <bits/stdc++.h>
using namespace std;
int main(){
    // int 型の変数(箱)を4つ作る
    int A, B, C, answer;

    // cin で入力を受け取ることができる。「>>」で区切ること(<<ではない)
    cin >> A >> B >> C;

    // 「A ≦ C < B」 は 「A ≦ C かつ A < B」と比較をする。
    if (A <= C && C < B) {
        answer = 1;
    } else {
        answer = 0;
    }

    // cout を使うと答えを出力することが出来る。「<<」で区切ること(>>ではない)
    // endl で改行する。
    cout << answer << endl;
}

また、変数answerを使わずに、if文の中で直接答えを出力しても良い。

#include <bits/stdc++.h>
using namespace std;
int main(){
    int A, B, C;
    cin >> A >> B >> C;

    if (A <= C && C < B) {
        cout << 1 << endl;
    } else {
        cout << 0 << endl;
    }
}

&& を使わずに、if文の内側にif文を書く別解

if 文の中に if 文を更に書くことで目的を達成することも出来る。

これにより複雑な条件を、&&を使わず比較的シンプルな機能のみを使って表現する事ができる。

今回の問題ではあまり推奨はしないが、この様なテクニックが有効活用できることもあるので、覚えておくとよいだろう。

#include <bits/stdc++.h>
using namespace std;
int main(){
    int A, B, C;
    cin >> A >> B >> C;

    if (A <= C) {
        if(C < B) {
            cout << 1 << endl;
        } else {
            cout << 0 << endl;
        }
    } else {
        cout << 0 << endl;
    }
}

9 行目は、\(A\leqq C < B\) のときに実行される。

11 行目は、\(A\leqq C \) だが \(C<B\) では無かった時、 つまり\(A<B\leqq C\)のときに実行される。

14 行目は、\(A\leqq C \) では無かった時、 つまり \(C < A < B\) のときに実行される。

posted:
last update: