AtCoder Beginner Contest 168 (ABC168) ふりかえり
こんばんは、日曜日に AtCoder Beginner Contest 168 がありました。
問題の名前が好きでした。作者は点々が好きなのだと思います。
結果は可もなく不可もなくといった感じです。欲を言うともう少し早く C 問題をときたかった。
軽くおさらいしていきます。
A - ∴ (Therefore)
atcoder.jp
普通に条件分岐で解きましたが、swich-case の方がスマートでした。
#include<bits/stdc++.h> using namespace std; int main(){ string N; cin >> N; if(N.at(N.size() - 1) == '3'){ cout << "bon" << endl; return 0; }else if(N.at(N.size() - 1) == '0' || N.at(N.size() - 1) == '1' || N.at(N.size() - 1) == '6' || N.at(N.size() - 1) == '8'){ cout << "pon" << endl; return 0; }else{ cout << "hon" << endl; return 0; } return 0; }
B - ... (Triple Dots)
atcoder.jp
これも条件分岐でちょちょいのちょいですね。テストの出力が "nikoand..." になったのは少し面白かったです。
#include<bits/stdc++.h> using namespace std; int main(){ int K; string S; cin >> K; cin >> S; if(S.size() <= K){ cout << S << endl; return 0; }else{ for (int i = 0; i < K; i++){ cout << S.at(i); } cout << "..." << endl; return 0; } return 0; }
C - : (Colon)
atcoder.jp
あまり見ないタイプの問題だという印象。自分はそれぞれの針先の x 座標と y 座標を求めてからピタゴラスの定理(三平方の定理)を使って長さを求めました。終わってからTLを見ているとどうやら余弦定理を使う解法が最もスマートなようです。Twiter でトレンド入りしてて笑いました。
#include<bits/stdc++.h> using namespace std; int main(){ double A, B, H, M, x1, x2, y1, y2, L; double PI = 3.141592653589793238; cin >> A >> B >> H >> M; x1 = A * sin(H * 2 * PI / 12 + M * 2 * PI / 60 / 12); y1 = A * cos(H * 2 * PI / 12 + M * 2 * PI / 60 / 12); x2 = B * sin(M * 2 * PI / 60); y2 = B * cos(M * 2 * PI / 60); L = pow(pow((x1 - x2), 2) + pow((y1 - y2), 2), 0.5); printf("%.11f\n", L); return 0; }
まとめ
C問題をもっと早く解きたかった。あと、グラフ理論についてそろそろちゃんと勉強しようかと思う。