AtCoder ABC 168

ABC3完の茶色パフォでした。今回のレベルでDまで行けなかったのは不甲斐ないので、改めて精進したい。

A - ∴ (Therefore)

問題のリンク

概要

  •  Nの一の位で場合分け

制約

  •  N 999以下の正の整数

考察

特になし

コード

N = input()

if int(N[-1]) in [2,4,5,7,9]:
    print('hon')
elif int(N[-1]) in [0,1,6,8]:
    print('pon')
else:
    print('bon')



B - ... (Triple Dots)

問題のリンク

概要

  • 文字列 Sの長さで場合分け

制約

  •  K 1以上、 100以下の整数
  •  Sは英小文字からなる文字列
  •  Sの長さは 1以上、 100以下

考察

特になし

コード

K = int(input())
S = input()

if len(S)<=K:
    print(S)
else:
    ans = S[:K] + '...'
    print(ans)



C - : (Colon)

問題のリンク

概要

  • ある時計の長針の長さ、短針の長さ、及び現時刻が与えられた時の長針の先端と短針の先端の距離

制約

  • 入力は全て整数
  •  1 ≤ A, B ≤ 1000
  •  0 ≤ H ≤ 11
  •  0 ≤ M ≤ 59

考察

 三平方の定理をググれば理論上はすぐに解ける問題。だが当初、短針の角度を(H/12) * 360)としてしまっており、計算が合わず時間をロスしてしまった。正しくはminuteも考慮した((H/12) * 360) + (30*(M/60))。これに気づくまでに時間がかかってしまった。今後は気を付けたい。

コード

import math

A, B, H, M = map(int, input().split())

ka_a = ((H/12) * 360) + (30*(M/60))
ka_b = M/60 * 360

kakudo = max(ka_a, ka_b) - min(ka_a, ka_b)
kakudo = min(kakudo, (360-kakudo))
cos = math.cos(math.radians(kakudo))

if kakudo==180:
    print(A+B)
    exit()

ans = A**2 + B**2 - 2*A*B*cos

print(math.sqrt(ans))



D - .. (Double Dots)

問題のリンク

概要

  • いわゆる最短経路問題
  • 最短経路を通った際、次に進む先のノードの番号を求める

制約

  • 入力は全て整数
  •  2 ≤ N ≤ 10^{5}
  •  1 ≤ M ≤ 2×10^{5}
  •  1 ≤ A_i, B_i ≤ N(1 ≤ i ≤ M)
  •  A_i ≠ B_i(1 ≤ i ≤ M)
  • どの 2部屋間も、道路をいくつか通って行き来できる

考察

  • 根( 1番目の部屋)をスタートに幅優先探索をしていく
  • 制約上、どの二部屋間も行き来できる(つまり必ず1のゴールにたどり着けるという保証がされている)ので、Noの答えはあり得ない。つまり、探索すべきグラフは必ず一つしかあり得ない。

コード

from collections import deque

def bfs_tree(graph, v=1):
    """
    graph: グラフ
    v: スタート
    """
    # 矢印がどこを向いているか
    # -1だと未探索
    arrow = [-1]*len(graph) 
    q = deque()
    q.append(v)
    arrow[v] = 0
    while q:
        now = q.popleft()
        for next_v in graph[now]:
            if arrow[next_v] != -1:
                continue
            else:
                q.append(next_v)
                arrow[next_v] = now
    return arrow

N, M = map(int, input().split())
graph = [[] for _ in range(N)]
pre = []

for _ in range(M):
    A, B = map(int, input().split())
    graph[A-1].append(B-1)
    graph[B-1].append(A-1)

arrow = bfs_tree(graph, 0)

print('Yes')
for i in range(1, N):
    print(arrow[i]+1)