私の記録ブログ

趣味の記録

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])