---
# System prepended metadata

title: 競プロ班講義 第三回

---

# 競プロ班講義 第三回

## 文法の復習
今回は、今まで学んだ内容に関連する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 (条件式) {
    処理
}

// 条件式１が真の時に処理１を、
// 条件式１が真でない、かつ条件式２が真の時処理２を、
// どちらの条件式も真でない時処理３を行う
if (条件式１) {
    処理１
} else if (条件式２) {
    処理２
} else {
    処理３
}
```

- **比較演算子・論理演算子**
```cpp
// 比較演算子
(x == y) //xとyは等しい
(x != y) //xとyは等しくない
(x > y) //xはyより大きい
(x >= y) //xはy以上

// 論理演算子
(条件式１ && 条件式２) //条件式１と条件式２がどちらも真の時true, そうでない時false
(条件式１ || 条件式２) //条件式１が真または条件式２が真の時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)





