#前回の記事
前回はAtCoderに参加した私の結果や反省を報告しました。
【ABC163へ参加してみた】在宅勤務になったのでマネジメント系SEが競技プログラミング始めてみた。#1
(需要があるかは全く分かりませんが)
今回の記事では私が解答できたABC問題について解説します。
#A問題:<A - Circle Pond>
###解説
円周を求める問題です。
円周は直径×円周率で求めることができますね。
直径については、入力値で半径を取得することができるのでOK!!
あと必要な円周率ですが以下のようにcmathを取り込むことでM_PIが使用できます。
#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;
}
そのためM_PIを使用せずとも学生時代にならった方も多い円周率=3.14を用いることもできます。
#B問題:<B - Homework>
ということは全ての宿題を終えるためにはこんなイメージになるのがわかると思います。
あと必要なのは「高橋君が夏休み(N日)の間に宿題を終えることができるのか」を判定することです。
#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>
###解説 こちらもB問題と同じく図に書くとわかると思います。実際の入力例を元にもう少しイメージを膨らませます。
この入力例の際には以下のような関係性になっています。
これだけだと私も当日あんまりイメージわかなかったので、
もう一段階として実際に上司と部下の関係をピラミッド的に書いてみます。
これでイメージついたでしょうか??
重要な点は**社員番号#1の人は必ず部下がいる(上司である)**ということです。
これらをふまえてコードを記載します。
#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;
}
#最後に
いかがだったでしょうか?
解説を記載するのも初めてなので、見ても解らないやもう少しこうすると良いのではないか?といった暖かい言葉ドシドシお待ちしています。