atcoder abc_123 を解いてみた(python3)
今回のABCはいつもより難しく感じました。
chokudaiさんの解説を見て納得することが多かったので、
この記事は私の回答ではなくすべて解説を元に書きます。
-A.Five Antennas
問題ページ【A - Five Antennas】
# -*- coding: utf-8 -*- L = [] for i in range(5): a = int(input()) L.append(a) K = int(input()) if L[4]-L[0]<=K: ans = 'Yay!' else: ans = ':(' print(ans)
5つのアンテナ間の距離が一箇所でもK未満ならば ':(' を出力する。
つまり、すべてのアンテナ間の距離を調べなくても、
最も遠いアンテナ間 (A, E) のみを調べれば良い。
最初私はすべてのアンテナ間を調べた。
-B.Five Dishes
問題ページ【B - Five Dishes】
# -*- coding: utf-8 -*- #注文してから料理が届くまでの時間 Time = [] for i in range(5): a = int(input()) Time.append(a) #注文してから次の注文が出来るまでの時間 nextTime = list(map(lambda x: (x+9)//10*10, Time)) #bestに最短時間を代入 best = 10**5 sum = 0 for i in range(5): for j in range(5): if i == j: sum = sum + Time[j] else: sum = sum + nextTime[j] best = min(best, sum) sum = 0 print(best)
Time : 注文してから料理が届くまでの時間
nextTime : 注文してから次の注文が出来るまでの時間
#注文してから次の注文が出来るまでの時間 nextTime = list(map(lambda x: (x+9)//10*10, Time))
ここで何してるかの説明
・式について
ans = (x+9)//10*10
#例 ans = (20+9)//10*10 print(ans) #20 ans = (23+9)//10*10 print(ans) #30
ある数字の一の位が 0 のとき、十の位はそのままで、
一の位が 1 ~ 9 のとき、十の位は 1 増える。
つまり切り上げしてる。
・lambda関数【Pythonの無名関数(ラムダ式、lambda)の使い方 | note.nkmk.me】
(無名関数とも言う)
new = lambda 引数 : 式
deff を使わなくても簡単な new という関数が出来る。
・map関数【【Pythonステップアップ!】高階関数mapの便利な使い方 | 侍エンジニア塾ブログ(Samurai Blog) - プログラミング入門者向けサイト】
map(関数, シーケンス)
シーケンスとは複数の要素をもったオブジェクト。
シーケンスの各要素を、受け取った関数に渡して実行してくれる。
この一行で、Time の要素を自分で作った関数に渡して、
切り上げした値をリストにしてる。
二重forループで、一番最後に注文する料理を変えながら合計時間を出して
best に最小値が出るたびに代入していく。
-C.Five Transportations
問題ページ【C - Five Transportations】
# -*- coding: utf-8 -*- N = int(input()) L = [] for i in range(5): a = int(input()) L.append(a) Lmin = min(L) ans = (N+Lmin-1)//Lmin + 4 print(ans)
こういう問題を「ボトルネック」というらしい。
いろんな交通機関があるけれど、結局一番乗車人数が少ない乗り物に全体の能力を支配される。
Lmin に最小乗車人数を入れる。
次の一行で、切り上げを使って移動時間を計算している。
ans = (N+Lmin-1)//Lmin + 4 (N+Lmin-1)//Lmin #すべての人が都市1からいなくなる時間 + 4 #都市2に残ってた人が都市6につく時間
-D.Cake 123
問題ページ【D - Cake 123】
chokudaiさんはC++で実装して【AC】でした。
そのアルゴリズムをpythonで実装すると【TEL】になりました。
今の私にはこれ以上直せないので、C++も覚えようかと思います。
# -*- coding: utf-8 -*- X, Y, Z, K = map(int,input().split(' ')) *a, = map(int,input().split(' ')) *b, = map(int,input().split(' ')) *c, = map(int,input().split(' ')) a.sort(reverse=True) b.sort(reverse=True) c.sort(reverse=True) abc = [] for i in range(len(a)): if i > K+1: break for j in range(len(b)): if i+j > K+1: break for k in range(len(c)): if i+j+k > K+1: break abc.append(a[i]+b[j]+c[k]) abc.sort(reverse=True) for i in range(K): print(abc[i])