【ABC166へ参加してみた】在宅勤務になったのでマネジメント系SEが競技プログラミング始めてみた。#5 -解説も-

#今回の記事
ABC166に参加しましたので共有。
今回もB問題までしか解けず。。
昨日と同じくB問題までなので解説も合わせて記載します。

解説に飛ぶ方は[こちら](https://qiita.com/makom/items/e637f5ec478fc4d50b31#%E5%95%8F%E9%A1%8C%E8%A7%A3%E8%AA%AC)

またTwitter始めました。あんまり使い方わからないけど、是非フォローしてください。
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">Atcoderを始めたのでqiitaで記事を書いてみてます。<a href="https://t.co/a6rRR2ixUX">https://t.co/a6rRR2ixUX</a><a href="https://twitter.com/hashtag/AtCoder?src=hash&amp;ref_src=twsrc%5Etfw">#AtCoder</a></p>&mdash; Makoto.M (@Makoto_M_coder) <a href="https://twitter.com/Makoto_M_coder/status/1256967918442536960?ref_src=twsrc%5Etfw">May 3, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

#当日の解答結果
前回(といっても昨日)と同じくB問題しか解けませんでした。
<img width="741" alt="スクリーンショット 2020-05-03 23.12.09.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/509729/59195563-e08e-b5ef-70c3-60e48d7dc8d2.png">

#振り返りと反省
実は今回から過去の反省を活かしてコンテストの環境を変えてみました。

#####1.アップロードなどの自動化ツールの導入
今回以下の記事を参考にして、AtCoderのサンプルケースのダウンロード＆テストや
最終的な提出を自動化するツールを入れました。
おかげで過去やらかしまくった人為的ミスを最小限にできたのと、
いちいちコピペでやっていたサンプルケースの入力が楽ちんになりました。
まだ入れていない人は是非入れてみるといいと思います。お勧めです。
＜参考記事＞
[AtCoder のディレクトリ作成・サンプルケースのテスト・提出を自動化する。atcoder-cli と online-judge-tools](https://qiita.com/NaokiOsako/items/dcbc0a91e1bbca8ee45d)
[AtCoderのための環境作成: 自動テスト, コマンド提出 (oj, acc)](https://qiita.com/NaokiOsako/items/dcbc0a91e1bbca8ee45d)

#####2.エディタをXcodeからAtomへ
１に合わせてできるだけ簡単に利用＆起動できる仕組みを作るためにエディタをXcodeからatomへ変えました。
(XcodeはXcode独自のプロジェクトファイルを作る必要があるのですが、1の自動化にそれを組み込むやり方を私は知らず)
ただエディタを変えた感想としては、Xcodeだと文法ミスもコンパイル前に怒ってくれたんですが、
atomはコンパイルしないとわからないので、私のようにセミコロン忘れたりする人は
結構困る部分もありました。
(この辺り解決できる機能を知ってる人いたら教えてください)

#####3.提出結果をちゃんと表示する
前回、提出して正解したつもりになっていたので、今回は提出結果のページをタブに表示し
提出後逐一リロードしてました。

#####4.incudeファイルの変更
includeファイルを下記に変更しました。
競技プログラミングでは御用達のようで、全てのincludeファイルが入ってるとか。
導入についてはこちらの記事を参考にしました。

```
#include<bits/stdc++.h>
```

＜参考記事＞
[厳選！C++ アルゴリズム実装に使える 25 の STL 機能【前編】]
(https://qiita.com/e869120/items/518297c6816adb67f9a5#%E6%A8%99%E6%BA%96%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA%E3%82%92%E4%BD%BF%E3%81%86%E6%96%B9%E6%B3%95)
#パフォーマンスについて
今回もC問題が解けなかったので、パフォーマンスは低めです。。
さすがに大事故した前回よりは上がっていますが。。
<img width="1110" alt="スクリーンショット 2020-05-03 23.12.27.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/509729/27a50595-0712-21d7-db62-67585f1cfdb7.png">

#問題解説
今回もB問題までしか解けなかったので、B問題までの解説をのせます。
#A問題：[A?C](https://atcoder.jp/contests/abc166/tasks/abc166_a)
<details><summary>問題文抜粋</summary>
<img width="922" alt="スクリーンショット 2020-05-03 23.32.42.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/509729/893f5426-dad5-ac3c-2151-fd3dd73aec85.png">
</details>
###解説
問題から以下のことがわかります。
　◆「ABC」が入力されたら「ARC」を出力する
　◆「ARC」が入力されたら「ABC」を出力する
　◆入力文字列Sは「ABC」「ARC」のどちらかしか入力されない
それらをまとめると以下のようなコードになります。

```C++:problemA.cpp
#include<bits/stdc++.h>
using namespace std;

int main(void) {
    string S;
    cin >> S;

    if(S=="ABC")           //ABCが入力されたら
      cout<<"ARC" <<endl;  //ARCを出力する
    else                   //ABCでない=ARCが入力されたら
      cout<<"ABC" <<endl;  //ABCを出力する

    return 0;
}
```
#B問題：[Trick or Treat](https://atcoder.jp/contests/abc166/tasks/abc166_b)
<details><summary>問題文抜粋</summary>
<img width="1108" alt="スクリーンショット 2020-05-03 23.46.15.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/509729/fbc6409b-4f03-a7a0-d1f4-bd0273bdf7f4.png">
</details>
###解説
問題文を整理していきます。
与えられたNとKはこんなイメージです。
<img width="389" alt="スクリーンショット 2020-05-03 23.55.00.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/509729/7c9ab42b-2c8f-1532-6827-792bdb92649e.png">
続いてはイメージ難しいので入力サンプル1を使っていきます。
この場合はこんな感じになります。
<img width="600" alt="スクリーンショット 2020-05-04 0.12.41.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/509729/fdf260e7-0f4e-4ef3-3d39-5244db756218.png">
つまり得られる入力に対して、お菓子毎にすぬけ君に番号を振り、最終的にお菓子を持っていない人を数えます。
それらを基にコードを記載します。

```C++:problemB.cpp
#include<bits/stdc++.h>
using namespace std;

int main(void) {
    int N,K;
    cin >> N >> K;

    int ans[N+1];

    for(int i=0; i<N+1; i++){
      ans[i] = 0; //すぬけ君に番号を振り、持っているお菓子の数をカウント
    }

    for(int i=0; i<K; i++){
      int d;
      cin >> d;
      int A[d];
      for(int j=0; j<d; j++){ //該当のお菓子を持っている人数
        cin >> A[j];  //該当のお菓子を持っている すぬけ君の番号を取得
        ans[A[j]]++;  //取得した番号の配列にカウントアップする
      }
    }
    int cnt =0;
    for(int i=1; i<N+1; i++){
      if(ans[i]==0) //お菓子を何も持っていない場合、すぬけ君をカウントする
        cnt++;
     }

     cout << cnt << endl;

    return 0;
}
```

#今後に向けて
前回紹介したこちらの記事を元に、標準ライブラリを確認しています。
特にvectorとか使ったことなかったので、お試し実装等をしています。
◆参考◆
[レッドコーダーが教える、競プロ・AtCoder上達のガイドライン【中級編：目指せ水色コーダー！】](https://qiita.com/e869120/items/eb50fdaece12be418faa)
#最後に
いかがだったでしょうか？
見ても解らないやもう少しこうすると良いのではないか？といった暖かい言葉ドシドシお待ちしています。
C問題については前回と合わせて理解できたタイミングで解説記載できればと思います。