De.HP

おバイクお出かけお写真とお釣りとおプログラミングとお雑記です。

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;
}

DEF

できなかった。Dは惜しかった気がする。ダイクストラ法か幅優先探索っぽい感じ。

まとめ

C問題をもっと早く解きたかった。あと、グラフ理論についてそろそろちゃんと勉強しようかと思う。