A - Legendary Players
問題文要約
競技者10人の名前と今のレートのデータがもらえるので、名前を言ったらその人のレートを出力してね。
入力・出力例
入力
tourist
出力
3858
このコンテストが開始した時点において、touristさんのアルゴリズム部門のレーティングは3858です。
考えた解法
名前とレートが入った2次元配列を作り、そこからデータを取り出すプログラムを作ります。
S = input() name = [["tourist", 3858], # [[名前1, レート1], [名前2, レート2], [ ... ]] ["ksun48", 3679], ["Benq", 3658], ["Um_nik", 3648], ["apiad", 3638], ["Stonefeang", 3630], ["ecnerwala", 3613], ["mnbvmar", 3555], ["newbiedmy", 3516], ["semiexp", 3481]] for i in range(len(name)): # リストの回数繰り返す 名前が一致するか検索 if S == name[i][0]: # もし文字列が今出したものと一致するなら print(name[i][1]) # その人のレートを出すよ break # 検索終わり
B - Measure
問題文要約
- N = 与えられた整数
- i = 0からNまでの整数のいずれか
- j = 1〜9のNの約数
(1) iがN / jの倍数であるものが存在するとき
jのうち最小のものをsiとする。
※i=0の場合はjは全て当てはまるので、必ずs0=1となる。
(2) 存在しないとき
"-"をsiとする。
jのうち最小のものをsiとする。
※i=0の場合はjは全て当てはまるので、必ずs0=1となる。
(2) 存在しないとき
"-"をsiとする。
s0〜sNをつなげた文字列を出力してね。
入力・出力例
入力
12
出力
1-643-2-346-1
解法
iを0から順番に見ていきます。
jは1〜9の中のどれかなので、ループを回してもそこまで処理に時間はかかりません。
① S / jが割り切れる かつ ② i / (S / j)が割り切れる とき、(1)の処理を行うようにプログラムします。
ただし、この条件だとj=0のとき、Sを0で割るという処理はできませんので、強制的にs0=1とするような処理を行います。
jは1〜9の中のどれかなので、ループを回してもそこまで処理に時間はかかりません。
① S / jが割り切れる かつ ② i / (S / j)が割り切れる とき、(1)の処理を行うようにプログラムします。
ただし、この条件だとj=0のとき、Sを0で割るという処理はできませんので、強制的にs0=1とするような処理を行います。
S = int(input()) ans = "" for i in range(S+1): # 0〜Nで順番にiを見ていく if i == 0: # i=0の場合 ans += "1" else: count = 0 for j in range(9): if S % (j+1) == 0 and i % (S // (j+1)) == 0: # %、//は割ったときの余り、商を出力したものだよ ans += str(j+1) elif j == 8: ans += "-" print(ans)
C - False Hope
問題文要約
この問題はかなり複雑なので、今回は省略します。
入力・出力例
入力
3 1 9 2 5 6 2 7 1
出力
0.666666666666666666666666666667
解法
総当たりの処理を正確に書くことが問われる問題だと思います。
今回は、総当たりで処理をするにあたって必要な、「1〜9の文字を並び替えた全ての通りのリスト」を取得する方法が分からなかったため、解くことができませんでした。
それを行うプログラムは以下の通りです。
今回は、総当たりで処理をするにあたって必要な、「1〜9の文字を並び替えた全ての通りのリスト」を取得する方法が分からなかったため、解くことができませんでした。
それを行うプログラムは以下の通りです。
permutations(range(9))
こちらのプログラムを用いて、全体のプログラムを書いたのが以下の通りです。
from itertools import permutations masu = [] for i in range(3): # 入力例の場合、masu=[3, 1, 9, 2, 5, 6, 2, 7, 1] masus = list(map(int, input().split())) for j in range(len(masus)): masu.append(masus[j]) # retsuは条件を満たすか調べる列一覧 retsu =[(0,1,2),(3,4,5),(6,7,8),(0,3,6),(1,4,7),(2,5,8),(0,4,8),(2,4,6)] # ordersは「1〜9の文字を並び替えた全ての通りのリスト」 orders = list(permutations(range(9))) ans = 0 for order in orders: for a, b, c in retsu: count = 0 # breakを2回行うためのカウント for _ in range(3): # a番目とb番目に選ばれたマスに書かれている数字が一緒 a番目よりc番目の方が遅い b番目よりc番目の方が遅い if masu[a]==masu[b] and order[a]<order[c] and order[b]<order[c]: ans += 1 count += 1 break a, b, c = b, c, a if count == 1: break print(1 - (ans / 362880))