c++未習者が2時間で情報オリンピック一次予選を通過できるようになる記事<Part1>

#### ※この記事は練習含め約40分で読み終えることを想定しています
この講座はPart1からPart3までに分かれています。
# はじめに
初めまして！中学生競技プログラマーのFです！
競技プログラミング、情報オリンピックと聞いて、「難しい」という印象を持たれる方は大変多くおられるように思います。しかし、実際のハードルはかなり低く、もちろん人間やめないと解けないレベルの問題もありますが、簡単な問題も用意されており、そういった問題は、基本的なプログラムを理解していると解けます！そこで、

「プログラミングに興味がある！」
「なんか暇だから暇つぶし欲しい！」
「趣味を見つけて垢抜けたい！」

という方に向けて、有名なプログラミングコンテストの中で最も簡単な(筆者調べ)、「情報オリンピック一次予選」を突破できるようになるための記事を書きました。

※この記事は、あくまで「情報オリンピック一次予選の対策」ですので、有識者の方からしますと、教える場所に問題があると思われるかもしれませんが、情報オリンピックの一次予選では、汎用性の塊である基本的なプログラムしか出ないので、おそらく問題ないという考えのもと書いております。ご了承ください。

※二次予選以降はレベルが跳ね上がるので、サポート対象外です。他の記事から学習することをお勧めします。

# 目次
- 情報オリンピックとは？
- Atcoderに登録しよう！
- 環境構築
- c++の基本形
- 出力
- 変数
- 配列
- プログラミングの五則計算
- 入力
- 練習問題
### 内容一覧
<details><summary>情報オリンピックとは？</summary>
日本情報オリンピックは、高校生までの競技プログラマー日本一を決める大会です。代表に選ばれると、世界大会にいけます。
詳しくは下のサイトを見てください。
※JOI2024 / 2025のものです

https://www.ioi-jp.org/joi-2025 

とにかくここで知っておかなければならないこと(一部一次予選のみにピックアップ)は
・Atcoderというサイトを使って行う
・一次予選は3回実施される
・一次予選では基本的なプログラムが出題される
・一次予選は80分で、4問中3問解ければ突破
ということです。

「基本的なプログラム」に関しては、次のことができれば問題ありません。
今のうちは意味わからなくても構いません。むしろそれが普通です。
・入力・出力
・プログラミングの五則計算
・if文を用いた条件判定の実装
・配列の概念の理解と実装
・for文を用いた全探索の実装
</details>

<details><summary>Atcoderに登録しよう！</summary>
Atcoderでは、情報オリンピックの過去問が、本番の問題形式で解けます。また、自動採点機能もついているので、ぜひ登録しましょう！

https://atcoder.jp/?lang=ja

・Atcoderにアクセスし、右上の「新規登録」を押します。
・少なくとも必須事項を入力し、新規登録します。

これで登録できました！Atcoderでは、毎週土日21時(日曜はない日もある)から、プログラミングコンテストが開催されているので、「土曜日の方のみ」参加してみることをお勧めします。　(日曜の方に出ると、難しすぎてメンタルが壊れます)
</details>

<details><summary>環境構築</summary>
学校の配布パソコンなどでもできるよう、今回はpaiza.IOを使います。下のサイトにアクセスしたら環境構築終わり！一応、言語がC++になっているか確認してください。

https://paiza.io/ja/projects/new?language=cpp
</details>
<details><summary>c++の基本形</summary>
いよいよ本題に入ります。
paiza.IOを開くと、次のようなものがありますよね。

``` c++
#include <iostream>
using namespace std;
int main(void){
    // Your code here!
    
}
```

これについては、理解しなくてもいいです。詳しいことが知りたい場合は、下のサイトを見てください。

https://atcoder.jp/contests/APG4b/tasks/APG4b_b 

では、コイツを全消去して、以下のように書き換えてください。できれば毎回。
テンプレとして、メモアプリなどにコピペしておいてもいいかもしれません。
※Visual Studioでは、bits/stdc++.h が対応していません。

``` c++
#include <bits/stdc++.h>
using namespace std;

int main() {
    
}

```
これがc++の基本形です。int main()の{ }の中にコードを書いていきます。
</details>

<details><summary>出力</summary>
c++で何かを出力する方法を紹介します。下のコードをコピーして貼り付けてください。

``` c++
#include <bits/stdc++.h>
using namespace std;

int main() {
    cout << 100 << endl;
    cout << 114 << 514 << endl;
    cout << "Hello" << endl;
    cout <<  endl;
    cout << "HelloWorld" << endl;
    cout << "Hello" << "World" << endl;
}
```
### 解説
・**<font color="Red">cout << (入力したいもの);　で入力できる！</font>**
coutは、「しーあうと」と読む
・**<font color="Red">文字を出力するときは " " (ダブルクオーテーション)をつける！</font>**
・**<font color="Red">endl は改行を表す！</font>**
・数字を出力するときはそのまま！
・cout << (入力したいもの) << (入力したいもの); で、つなげて入力できる！(個数制限なし)

※基本的に競技プログラミングの問題で何かを出力するときは、末尾にendlがいります。

; (セミコロン)について解説します。これは、c++をやる上で、絶対いります。基本的に文の終わりに着けます。　
int main(){
    
}
のような、範囲指定するカッコがある場合は基本いりません。
※まあ習うより慣れろって感じですねここは
</details>
<details><summary>変数</summary>
変数とは、データを記憶しておく場所。いわば、データの保管箱です。また、箱に形があるように、変数にも型があります。覚えておかなければいけないものを4つ挙げます。

|型|格納対象|
|:-----------------|------------------:|
| int              |整数|  
| double           |小数|   
| string           |文字列|   
| char             |文字| 

(補足)
・char型の集合体がstring型っていう感じの解釈でいいです。
・変数に格納対象外の情報をぶち込むのは絶対にやめましょう。そこはちゃんと確認してください。

<禁断奥義>auto型
autoという型で定義される変数は、**<font color="Red">勝手に型名を決めてくれます！</font>**
ただ、型名を途中で変えることはできないので、最初にstring型の情報を格納してから、int型に更新するなどはできないので、注意してください。個人的には型名をちゃんと分けるのを推奨します。

以下のコードをコピペしてください

 ``` c++
#include <bits/stdc++.h>
using namespace std;

int main() {
    int A = 1;
    double B = 2.0;
    string S = "Hello";
    cout << A << endl;
    cout << B << endl;
    cout << S << endl;
    S = "World";
    cout << S << endl;
}
```

実行すると、変数で定義した情報が表示されましたね！
ここから、以下のことが分かります。
・coutで変数を出力することができる。
・変数の値を更新できる( **<font color="Red">(変数名) = (入力したいデータ)</font>** で更新)
ちなみに、文字列や文字を表すのに " " や ' ' を使うのは、文字列と変数の違いを明らかにするためです。
</details>

<details><summary>配列</summary>
配列とは、変数の集合体です。箱が横に並んでいるようなイメージです。以下のプログラムをコピペしてください。

 ``` c++
#include <bits/stdc++.h>
using namespace std;

int main() {
    int A[4];
    A[0] = 1;
    A[1] = 2;
    A[2] = 3;
    cout << A[0] << endl;
    cout << A[1] << endl;
    cout << A[2] << endl;
    cout << A[3] << endl;
}
```

### 解説
入力したデータと0が表示されましたね！
以下のことが分かります。
・配列は、なんかよくわからん番号が振られてるだけで、別に変数と同じ
・値が未定義の場合は0が表示される(int型では)

このよくわからん番号は、配列の番号です。0番目から、0,1,2,3･･･(番目)と数えます。ただの変数によくわからん番号を付ける理由は、Part2の方で学習します。ですので、今は「こんなのがある」程度の解釈で構いません。
</details>

<details><summary>プログラミングの五則計算</summary>
四則演算やん。馬鹿じゃね？と思われるかもしれませんが、プログラミングでは、四則演算に加えて、割り算の余りを求める、'%' がよく使われます。ですので、私は五則演算と呼んでいます。以下のコードをコピペしてください。
 
 ``` c++
#include <bits/stdc++.h>
using namespace std;

int main() {
    int A[3];
    A[0] = 1;
    A[1] = 2;
    A[2] = 3;
    int B = 3 / 2; //割り切れないものをintに代入
    
    cout << A[0] + A[1] << endl; //足し算
    cout << A[0] - A[1] << endl; //引き算
    cout << A[0] * A[1] << endl; //掛け算
    cout << A[1] / A[0] << endl; //割り算(割り切れる)
    cout << A[2] % A[1] << endl; //余りの計算
    
     cout << B << endl;
}
```
### 解説
以下のことが分かります。
・'+'  で足し算ができる。
・'-'  で引き算ができる。
・'*'  で掛け算ができる。
・'/'  で割り算ができる。
・'%'  で余りの計算ができる。
・計算を変数に代入できる。
・割り切れない計算をint型に格納したとき、商は切り捨てられる。

ちなみに、数字と変数を組み合わせることもできるし、カッコ( )も数学と同じように使えます。
</details>

<details><summary>入力</summary>

入力のやり方は、以下の2ステップです。
1.適切な型の変数を用意する。
2.cin >> (変数);で入力する。
※cin >> (変数) >> (変数);  (>>は何個つなげてもOK!)
で同時に入力できるが、スペースキーまたはエンターで情報を分ける必要がある。
(例)cin >> A >> B;　の入力は、10 30　みたいな感じで半角スペースいる。
</details>

# 練習問題
もうこの時点で、一部の情オリ予選問題は解けます！過去問を扱っていきましょう！

JOI 2024/2025 一次予選 (第1回) 過去問 (3分)

https://atcoder.jp/contests/joi2025yo1a/tasks/joi2025_yo1a_a

JOI 2023/2024 一次予選 (第3回) 過去問 (3分)

https://atcoder.jp/contests/joi2024yo1c/tasks/joi2024_yo1c_a

JOI 2023/2024 一次予選 (第2回) 過去問 (3分)

https://atcoder.jp/contests/joi2024yo1b/tasks/joi2024_yo1b_a

お疲れ様です。この記事は終了しました。