1
0

More than 3 years have passed since last update.

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

Last updated at Posted at 2020-05-02

今回の記事

ABC165に参加しましたので共有。
今回はB問題までしか解けず。。(また色々あった。。)
B問題までなので解説も合わせて記載します。

解説に飛ぶ方はこちら

当日の解答結果

じゃーーーん。
はい、、、、色々事故りました。。
というかC問題が難しかった。。
スクリーンショット 2020-05-02 23.14.41.png

振り返りと反省

A問題とB問題でケアレスミスのために時間を大幅にロスしました。。
そしてA問題は解けてたと勘違いして放置してました。。実際はWA(不正解)だったのに。。
スクリーンショット 2020-05-02 23.17.44.png

1.B問題でのTLE(実行時間超過)

B問題では「long long int」にするのを忘れてしまっており
サンプルの数字を手元で試してみてもずっと終わらない状況。
勝手に計算量が多くてこれはダメなんだなと勘違いしてしまい、
悩んだけどわからなかったのでダメもとで「コードを提出」→「TLE」ってなってしまい
諦めてC問題へ行きました(結局解けなかったけど。。)

2.A問題を放置

A問題で初回にセミコロンが抜けており、コンパイルエラーに。。
そこで少し時間を使っちゃったので早く解こうと意識しすぎて、
修正した解答の結果を見ずにB問題へ突入してました。
結果的にはA問題で不等号の「=」が抜けておりWA(不正解)となってました。
それに気づいたのはC問題が難しすぎて諦めてみんなの提出状況を見たとき。
終わり10分前でした。。

3.C問題の難しさ

C問題は今回難しかったです。
提出状況みても上の方でさえもC問題を解かずにD問題やE問題を解答してる人が沢山いました。
本当に悩んでも出てこなければ一旦順位表を見るってのも
コンテストのテクニックとしては必要だなと実感しました。

パフォーマンスについて

そんなこんなで前回茶色コーダ相当だったパフォーマンスが。。。
調子にのった罰だと思って心を入れ替えます。
スクリーンショット 2020-05-02 23.13.05.png

問題解説

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

A問題:We Love Golf

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

解説

今回3回目の参加ですが、今までのA問題では難しい気がしました。
問題文にある以下2つのことに注目します。
 ◆ジャンボ高橋君の目標は飛距離をKの倍数にすること
 ◆ジャンボ高橋君の出せる飛距離の範囲はA以上B以下
そうすると「AからBまでの数字がKの倍数であるか」を判定すれば良いことがわかります。
Kの倍数かどうかは「%」演算子を使うことで判定できます。

problemA.cpp
#include <iostream>

using namespace std;

int main(int argc, const char * argv[]) {

   int k;
   cin >> k;

   int a,b;
   cin >> a >> b;

   for(int i=a; i<=b; i++){ //A〜Bまでの間でループをさせる
       if(i%k==0){ //Kの倍数かどうかを判定する
           cout << "OK" << endl;
           return 0;
       }        
   } 

   cout << "NG";
   return 0;
}

B問題:1%

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

解説

預金額のお金が1年で1%ずつ増えていくので、
最初のお金100円を1.01倍していきます。
ここで気をつけるのがnの制約が10の18乗以下までということ。
int型では足りないのでlong long int型を使います。

problemB.cpp
#include <iostream>

using namespace std;

int main(int argc, const char * argv[]) {

    long long int n; //10^18(10の18乗)以下なのでint型では桁不足)
    cin >> n;

    long long int money = 100; //nと同じ数字になるので、条件を合わせておく
    int year =0;

    while(money < n){ //お金がNを超えるとループがおわる
        money = money*1.01; //利子が1%増える
        year++; //年数をたす
    }

    cout << year << endl;

    return 0;
}

今後に向けて

以前の記事で書いたAOJは既に終えて、現在下記の記事を参考に標準ライブラリを勉強し始めました。
今見てる限りはとてもわかりやすい記事なので、是非見ていない人は一読をお勧めします。
また初級者向けもありAOJをお勧めしてました。
結果的に私も初級者側で記載いただいた流れと同じ流れで勉強していました。
この記事知ってれば何やろうか迷わなくてすんだのに。。

◆参考◆
レッドコーダーが教える、競プロ・AtCoder上達のガイドライン【中級編:目指せ水色コーダー!】

最後に

いかがだったでしょうか?
今回解説については図を記載する内容ではないかなと思ったので省きました。
見ても解らないやもう少しこうすると良いのではないか?といった暖かい言葉ドシドシお待ちしています。

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