# 競プロ班講義 第三回 ## 文法の復習 今回は、今まで学んだ内容に関連するAtCoderの問題をいくつか解いていきます。問題を解き始める前に、前回学んだ内容と今日までに予習をお願いした内容のうち、重要な文法について振り返っておきます。 - **変数の宣言** ```cpp int a; //int型の変数を宣言 a = 5; //変数aに値5を代入 int b = 5; //変数の宣言と値の初期化を同時に行う b = a; //変数aに入っている値を変数bに代入 ``` - **型** ```cpp int i = 10; //int型(整数) double d = 0.5; //double型(小数) bool b = true; //bool型(真・偽を表すtrue・falseのいずれかをとる型) ``` - **出力** ```cpp cout << "Hello" << endl; //文字列の出力はダブルクォーテーションで囲む int a = 5; cout << 5 << endl; //数字や cout << a << endl; //変数はそのまま書く ``` - **入力** ``` A B ``` のようにA, Bの値が与えられる場合、 ```cpp int A, B; cin >> A >> B; ``` のように入力を受け取れる - **if・else文** ```cpp // 条件式が真の時のみ処理を行う if (条件式) { 処理 } // 条件式1が真の時に処理1を、 // 条件式1が真でない、かつ条件式2が真の時処理2を、 // どちらの条件式も真でない時処理3を行う if (条件式1) { 処理1 } else if (条件式2) { 処理2 } else { 処理3 } ``` - **比較演算子・論理演算子** ```cpp // 比較演算子 (x == y) //xとyは等しい (x != y) //xとyは等しくない (x > y) //xはyより大きい (x >= y) //xはy以上 // 論理演算子 (条件式1 && 条件式2) //条件式1と条件式2がどちらも真の時true, そうでない時false (条件式1 || 条件式2) //条件式1が真または条件式2が真の時true, いずれも偽の時false ``` - **複合代入演算子** ```cpp int x = 5; x += 1 + 2; // x = x + (1 + 2)と書くのと同じ //+以外の主要な演算子についても同様 int a = 5; a -= 2; // a = a - 2 int b = 3 b *= 3; // b = b * 3 int c = 4; c /= 2; // c = c / 2 int d = 5; d %= 2; // d = d % 2 ``` - **インクリメント・デクリメント** ```cpp int x = 5, y = 5; //インクリメント x++; //x += 1 と書くのと同じ //デクリメント y--; //y -= 1 と同じ ``` - **for文とbreak・continue** for文を用いて処理をN回繰り返す ```cpp for (int i = 0; i < N; i++) { 処理 } ``` break・continueを用いてループ処理を制御する ```cpp for (int i = 0; i < 5; i++) { if (i == 2) { continue; //後の処理をとばして次のループへ } else if (i == 4) { break; //直ちにループを抜ける } cout << i << endl; } ``` 出力 ``` 0 1 3 ``` # 演習 それでは、学んだ内容にまつわる演習問題を解いていきます。 競プロでは問題を解くことがとにかく大切です!問題を解くことによって、実装力(望んだ処理を正しく実装する力)が上がったり、新たな知識が得られたりします。 競プロが強くなりたい人は[AtCoder Problems](https://kenkoooo.com/atcoder/#/table/)などを利用してどんどん問題を解くようにしましょう! --- ### [ABC086A - Product](https://atcoder.jp/contests/abs/tasks/abc086_a) ### 問題概要 2つの正整数a, bが与えられる。aとbの積が偶数か奇数か判定せよ。偶数であれば"Even"と、奇数であれば"Odd"と出力せよ。 ### ポイント 偶数、奇数の定義から、xが2で割り切れる時xは偶数、2で割り切れない時xは奇数であると言える。 整数xが2で割り切れるかどうかは、演算子%を用いて次のように判定できる。 ```cpp (x % 2 == 0) //この条件式が真である時xは偶数、偽の時奇数 ``` ### 実装 ```cpp= #include <iostream> using namespace std; int main() { int a, b; cin >> a >> b; //入力 int product = a * b; // aとbの積 if (product % 2 == 0) { cout << "Even" << endl; } else { cout << "Odd" << endl; } } ``` ### 類題 整数a, bに対して、aがbで割り切れるか判定する必要のある問題はよく出題されます。 演習問題を解いてみましょう。 #### [A - RGB Cards](https://atcoder.jp/contests/abc064/tasks/abc064_a) #### [A - Duplex Printing](https://atcoder.jp/contests/abc157/tasks/abc157_a) #### [A - Takoyaki](https://atcoder.jp/contests/abc176/tasks/abc176_a) (難しいです。切り上げの処理を書く必要があります) --- ### [ABC087B - Coins](https://atcoder.jp/contests/abs/tasks/abc087_b) ### 問題概要 500円玉をA枚、100円玉をB枚、50円玉をC枚持っています。合計金額がちょうどX円となるような払い方は何通りあるか求めよ。 ### 例(A = 2, B = 2, C = 2, X = 100の場合) 合計金額がちょうどX円となる払い方は、 - 500円玉を0枚、100円玉を0枚、50円玉を2枚選ぶ - 500円玉を0枚、100円玉を1枚、50円玉を0枚選ぶ の2通りなので、答えは2 ### ポイント 500円玉、100円玉、50円玉をそれぞれa, b, c枚選んで払うとき、合計金額は500a + 100b + 50cとなる。これがXと等しいか判定すれば、この選び方が問題文の条件を満たす選び方かどうかわかる。 よって、全ての選び方(つまり、全ての0 <= a <= A, 0 <= b <= B, 0 <= c <= C)を試し、合計金額がXと等しくなるかどうか判定すればよい。 ### 実装 ```cpp= #include <iostream> using namespace std; int main() { int A, B, C, X; cin >> A >> B >> C >> X; //入力を受け取る int ans = 0; //答えを表す変数。0に初期化しておいて、 //全探索していく中で、条件を満たすものが見つかったら、これに1を加える // 全ての 0 <= a <= A, 0 <= b <= B, 0 <= c <= C について試す for (int a = 0; a <= A; a++) { for (int b = 0; b <= B; b++) { for (int c = 0; c <= C; c++) { int sum = 500 * a + 100 * b + 50 * c; //合計金額 if (sum == X) { ans++; //合計金額がXに等しい、つまりこの選び方は条件を満たすので、答えに1を加算する } } } } cout << ans << endl; //答えを出力 } ``` ### 類題 こういった、ありうる選び方を全て試し、特定の条件を満たすかどうかを判断する方法を全探索と呼びます。AtCoderのコンテスト(の特に序盤)ではしばしば全探索で解くことのできる問題が出題されます。全探索の実装は、はじめは難しく感じるかもしれませんが、問題を解いていくことで次第に慣れていきましょう! 演習問題: #### [B - Cakes and Donuts](https://atcoder.jp/contests/abc105/tasks/abc105_b) #### [B - 81](https://atcoder.jp/contests/abc144/tasks/abc144_b) #### [B - Good Distance](https://atcoder.jp/contests/abc133/tasks/abc133_b) (難しいです。) #### [B - Making Triangle](https://atcoder.jp/contests/abc175/tasks/abc175_b) (上の問題と探索の仕方が似ています) #### [B - Savings](https://atcoder.jp/contests/abc206/tasks/abc206_b)