AtCoder Beginner Contest 001
A - 積雪深差
# coding: utf-8 H1 = int(input()) H2 = int(input()) print(H1 - H2)
B - 視程の通報
問題文に従って条件分岐します。
m = int(input()) if 100 > m: print('00') elif 5000 >= m: print("{:02d}".format(m // 100)) elif 30000 >= m: print(m // 1000 + 50) elif 70000 >= m: print((m // 1000 - 30) // 5 + 80) else: print(89)
C - 風力観測
round()
は偶数寄りに丸めらます。そのため、round(1.5)
の結果は2ですが、round(2.5)
の結果も2になります。
# coding: utf-8 def deg_to_dir(deg): """Summary line. 風向から方位を返します。 Args: deg (int): 風向 Returns: string: 方位 """ degs_list = ['N', 'NNE', 'NE', 'ENE', 'E', 'ESE', 'SE', 'SSE', 'S', 'SSW', 'SW', 'WSW', 'W', 'WNW', 'NW', 'NNW'] deg_index = ((deg * 10 + 1125) // 2250) % 16 return degs_list[deg_index] def dis_to_w(dis): """Summary line. 風程から風力を返します。 Args: des (int): 風程 Returns: w (int): 風力 """ w = -1 ws_list = [0.0, 0.3, 1.6, 3.4, 5.5, 8.0, 10.8, 13.9, 17.2, 20.8, 24.5, 28.5, 32.7] r_dif = int(dis * 10 + 0.5) / 10 for n in ws_list: if r_dif >= n: w += 1 else: break return w def dir_w(deg, dis): """Summary line. 風向、風程から方位と風力を返します。 Args: deg (int): 風向 des (int): 風程 Returns: (strint, int): (方位, 風力)のタプル """ w = dis_to_w(dis) if w == 0: dir = 'C' else: dir = deg_to_dir(deg) return (dir, w) Deg, Dis = map(int, input().split()) result = dir_w(Deg, Dis) print(*result)
D - 感雨時刻の整理
降り始め・降り終わりをそれぞれ直前・直後の 5 分単位の時刻に丸めます。
降り始めは、5による剰余を引くことで簡単に求めることができます。
# 13:23 の場合、1323 mod 5 = 3 なので、13:23 - 3 = 13:20 start -= start % 5
降り終わりは、5から5による剰余を引いた結果を足すことで、求めることができます。
# 14:01 の場合、1401 mod 5 = 1 なので、14:01 + (5 - 1) = 14:05 end += 5 - end % 5
しかしこの計算では、0分、5分の場合に、余計に5分足してしまうことになります。
# 14:00 の場合、1400 mod 5 = 0 なので、14:00 + (5 - 0) = 14:05 end += 5 - end % 5
そのため、5による剰余が0の場合は0を足し、1から4の場合は5から5による剰余を引いた結果を足すようにします。
そこで、5による剰余に4を足し、5で割った商の整数部分を結果に掛けることにします。そうすることで、剰余が0の場合は0を掛けることになり、結果0を足し、1から4の場合は1を掛けることで結果を足すようになります。
# 14:00 の場合、1400 mod 5 = 0 なので、 # ((4 + 0) // 5) * (5 - 0) = 0 * 5 = 0 # つまり、14:00 + 0 = 14:00 # # 14:01 の場合、1401 mod 5 = 1 なので、 # ((4 + 1) // 5) * (5 - 1) = 1 * 4 = 4 # つまり、14:00 + 1 = 14:05 end += ((4 + end % 5) // 5) * (5 - end % 5)
最後に、56分以降は、時間(hour)も繰り上げなければなりません。
ここでは、100による剰余を求めることで分(minute)を抜き出し、56分を基準に、つまり、56で割った整数部の商に40を掛けることで時間を繰り上げます。
# 14:56 の場合、 1456 mod 100 = 56 、56 // 56 = 1 なので、 # 1 * 40 = 40 end % 100 // 56 * 40
これで、降り終わりが丸めることができます
# 14:56 の場合、 # 1456 mod 5 = 1 、1456 mod 100 = 56 なので、 # ((4 + 1) // 5) * (5 - 1) + (56 // 56 * 40) # (1 * 4) + (1 * 40) = 44 # つまり、1456 + 44 = 1500 => 15:00 end += ((4 + end % 5) // 5) * (5 - end % 5) + (end % 100 // 56 * 40)
解答
# coding: utf-8 N = int(input()) times_set = [] results = [] start_index = 0 end_index = 1 tmp_start = -1 tmp_end = -1 for i in range(N): start, end = map(int, input().split('-')) start -= start % 5 end += ((4 + end % 5) // 5) * (5 - end % 5) + end % 100 // 56 * 40 times_set.append([start, end]) times_set.sort() for time_set in times_set: if tmp_start == -1: tmp_start = time_set[start_index] tmp_end = time_set[end_index] elif time_set[start_index] <= tmp_end: if tmp_end <= time_set[end_index]: tmp_end = time_set[end_index] else: results.append("{:04d}-{:04d}".format(tmp_start, tmp_end)) tmp_start = time_set[start_index] tmp_end = time_set[end_index] results.append("{:04d}-{:04d}".format(tmp_start, tmp_end)) for result in results: print(result)