1
0

More than 3 years have passed since last update.

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

Last updated at Posted at 2020-05-03

今回の記事

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

解説に飛ぶ方はこちら

またTwitter始めました。あんまり使い方わからないけど、是非フォローしてください。

当日の解答結果

前回(といっても昨日)と同じくB問題しか解けませんでした。
スクリーンショット 2020-05-03 23.12.09.png

振り返りと反省

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

1.アップロードなどの自動化ツールの導入

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

2.エディタをXcodeからAtomへ

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

3.提出結果をちゃんと表示する

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

4.incudeファイルの変更

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

#include<bits/stdc++.h>

<参考記事>
厳選!C++ アルゴリズム実装に使える 25 の STL 機能【前編】

パフォーマンスについて

今回もC問題が解けなかったので、パフォーマンスは低めです。。
さすがに大事故した前回よりは上がっていますが。。
スクリーンショット 2020-05-03 23.12.27.png

問題解説

今回もB問題までしか解けなかったので、B問題までの解説をのせます。

A問題:A?C

問題文抜粋
スクリーンショット 2020-05-03 23.32.42.png

解説

問題から以下のことがわかります。
 ◆「ABC」が入力されたら「ARC」を出力する
 ◆「ARC」が入力されたら「ABC」を出力する
 ◆入力文字列Sは「ABC」「ARC」のどちらかしか入力されない
それらをまとめると以下のようなコードになります。

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

問題文抜粋
スクリーンショット 2020-05-03 23.46.15.png

解説

問題文を整理していきます。
与えられたNとKはこんなイメージです。
スクリーンショット 2020-05-03 23.55.00.png
続いてはイメージ難しいので入力サンプル1を使っていきます。
この場合はこんな感じになります。
スクリーンショット 2020-05-04 0.12.41.png
つまり得られる入力に対して、お菓子毎にすぬけ君に番号を振り、最終的にお菓子を持っていない人を数えます。
それらを基にコードを記載します。

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上達のガイドライン【中級編:目指せ水色コーダー!】

最後に

いかがだったでしょうか?
見ても解らないやもう少しこうすると良いのではないか?といった暖かい言葉ドシドシお待ちしています。
C問題については前回と合わせて理解できたタイミングで解説記載できればと思います。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0