perarduaadastra

競技プログラミングとかをしています

ZONe プログラミングコンテスト ネタバレ 答え

t.co

これの答えを書いていきます!よろしくおねがいします!

 

 

1問目

rot13をやれと書いてありますね!

"ZONe"という文字列の個数を数えればいいので、pythonであればcount関数が使えそうです!

print(input().count("ZONe"))

というコードで正解できます!

 

2問目

算数をやれと書いてありますね!

UFOに電波が届かないとき、電波が一個の障害物に当たっていることになります。逆も成り立ちますね!

距離d、高さhの障害物に電波が当たらないようにするためには、少なくとも

H-D(H-h)/(D-d)

以上の高さから電波を発する必要がありますね!

N,D,H=map(int,input().split());res=0
for _ in range(N):d,h=map(int,input().split());res=max(res,H-D*(H-h)/(D-d))
print(res)

というコードで正解できます!

 

3問目

やれと書いてありますね!

「答えをxにできるか?」という判定問題を考えるのが定石ですね!

2人を既に選んだ時点で、(パワー, スピード, 根性)など、特定の複数のパラメータがチームに足りないとき、足りない部分のパラメータの最小値が最大の人を選ぶのが最適ですね!

ところで、3人目に限らず、ある特定のいくつかのパラメータに絞ってみた時に最適な人をチームに入れるのが正しそうですよね!

そこで、5つのパラメータの任意の組み合わせ31通りについて、各パターンでパラメータの最小値が最大の人を先に選んでおくと、チームはこの31人から3人を選ぶのが良さそうですね!

 

from itertools import combinations as np
N=int(input())
a=[tuple(map(int,input().split())) for _ in range(N)]
aa=[]
res=0
def plt(x,pd):
  res=10**9
  for i in range(5):
    if i in pd:res=min(res,x[i])
    return res
for c in range(1,6):
  for pd in np([i for i in range(5)], c):aa.append(max(a,key=lambda x:plt(x,pd)))
for pd in np(aa,3):res=max(res,min([max(pd[0][i],pd[1][i],pd[2][i]) for i in range(5)]))
print(res)

このコードで正解できます!

 

さいごに

全部解くことができました!いかがでしたか?

ZONeの進化には今後も目が離せませんね!