# 競プロ班講義 第三回
## 文法の復習
今回は、今まで学んだ内容に関連する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)