0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Last updated at Posted at 2020-04-20

#前回の記事
前回はAtCoderに参加した私の結果や反省を報告しました。
【ABC163へ参加してみた】在宅勤務になったのでマネジメント系SEが競技プログラミング始めてみた。#1

(需要があるかは全く分かりませんが)
今回の記事では私が解答できたABC問題について解説します。

#A問題:<A - Circle Pond>

問題文抜粋 スクリーンショット 2020-04-20 16.28.40.png

###解説
円周を求める問題です。
円周は直径×円周率で求めることができますね。
直径については、入力値で半径を取得することができるのでOK!!
あと必要な円周率ですが以下のようにcmathを取り込むことでM_PIが使用できます。

problemA.cpp
#include <iostream>
#include <cmath>

using namespace std;

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

    int r;
    cin >> r;

    cout << 2*r*M_PI << endl; //M_PIは円周率

    return 0;    
}

問題分をよく読むと、以下の記載があります。
スクリーンショット 2020-04-20 16.35.05.png

そのためM_PIを使用せずとも学生時代にならった方も多い円周率=3.14を用いることもできます。

#B問題:<B - Homework>

問題文抜粋 スクリーンショット 2020-04-20 16.47.14.png

###解説
図に書くとイメージがつきやすいと思います。
スクリーンショット 2020-04-20 16.49.36.png

ということは全ての宿題を終えるためにはこんなイメージになるのがわかると思います。
スクリーンショット 2020-04-20 16.50.03.png

あと必要なのは「高橋君が夏休み(N日)の間に宿題を終えることができるのか」を判定することです。

problemB.cpp
#include <iostream>
 
using namespace std;
 
int main(int argc, const char * argv[]) {
 
    int n,m;
    cin >> n >> m;
 
    int a[m];
    for(int i=0; i<m; i++) cin >> a[i];
    
    int total = 0;
    
    for(int i=0; i<m; i++){
        total += a[i]; //宿題日数を足し合わせ
    }
    
    int judge = n-total; //夏休みの日数から宿題のトータル日数をマイナス
    
    if(judge<0) //はたして高橋君は宿題を終えることができるのか。。
        cout << "-1" << endl;
    else
        cout << judge << endl;
    
    return 0;
    
}

#C問題:<C - management>

問題文抜粋 スクリーンショット 2020-04-20 17.05.23.png
###解説 こちらもB問題と同じく図に書くとわかると思います。 スクリーンショット 2020-04-20 17.07.02.png

実際の入力例を元にもう少しイメージを膨らませます。
スクリーンショット 2020-04-20 17.08.01.png
この入力例の際には以下のような関係性になっています。
スクリーンショット 2020-04-20 17.14.57.png

これだけだと私も当日あんまりイメージわかなかったので、
もう一段階として実際に上司と部下の関係をピラミッド的に書いてみます。
スクリーンショット 2020-04-20 17.10.54.png
これでイメージついたでしょうか??
重要な点は**社員番号#1の人は必ず部下がいる(上司である)**ということです。

これらをふまえてコードを記載します。

problemC.cpp
#include <iostream>

using namespace std;

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

    int n;
    cin >> n;

    int a[n];
    a[1] = 0; //社員番号#1(a[1])は一番偉いから上司はいない
    
    for(int i=2; i<=n; i++) cin >> a[i]; //社員番号#2〜#Nの上司の人数を入力
    
    int ans[n];
    for(int i=1; i<=n; i++) ans[i] = 0; //配列の初期化
    
    int tmp;
    
    for(int i=1; i<=n; i++){
        tmp = a[i];
        ans[tmp]++; //社員番号#iの上司である人の社員番号a[i]をカウント
    }
    
    for(int i=1; i<=n; i++) cout << ans[i] << endl; //カウントした結果を出力
    
    return 0;
    
}

#最後に
いかがだったでしょうか?
解説を記載するのも初めてなので、見ても解らないやもう少しこうすると良いのではないか?といった暖かい言葉ドシドシお待ちしています。

0
1
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
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?