問題:ABC 209 A - Counting
問題文
$A$ 以上かつ $B$ 以下の整数はいくつありますか?
制約
・$1 \le A \le 100$
・$1 \le B \le 100$
・$A,B$ は整数である。
回答1 (AC)
$1$ 以上 $N$ 以下の整数の個数は $N$ 個なので、$A$ 以上 $B$ 以下の整数の個数は「($1$ 以上 $B$ 以下の整数の個数) - ($1$ 以上 $A-1$ 以下の整数の個数)」と考えて、$B-(A-1)$ 個となります。条件から $A>B$ の場合もあり得るので、この場合は $0$ 個を答えるような場合分けが必要となります。計算量は $O(1)$ です。
私が ABC 209 に参加したときの提出コードは同じ方針でしたが、$A>B$ の場合を見逃していて誤答を繰り返してしまいました。
#include <bits/stdc++.h>
using namespace std;
int main() {
int a, b;
cin >> a >> b;
if ( a>b ) {
cout << 0 << endl;
} else {
cout << b-a+1 << endl;
}
}
回答2 (AC)
for 文を使って整数の個数を素直に数える方法も考えられます。この場合、$A>B$ のときには for 文が実行されないだけなので、回答1のような場合分けは不要です。コードは以下のようになりますが、計算量は $O(B-A)$ となってしまうため、$A, B$ の値が巨大な場合にはうまくいかない可能性があります。
#include <bits/stdc++.h>
using namespace std;
int main() {
int a, b;
cin >> a >> b;
int integer = 0;
for ( int i=a; i<=b; i++ ) {
integer += 1;
}
cout << integer << endl;
}
調べたこと
AtCoder の解説 → 公式解説
回答1と同じ方針でした。max(0,b-a+1) とすると場合分けが不要になるとのこと。なるほど。
リンク
- 前のログ → AtCoderログ:0013 - ABC 209 に参加しました
- 次のログ → AtCoderログ:0015 - ABC 209 B