こんにちは!バイオインフォマティクス系オタク修士学生のroadricefieldです!AtCoder ABC193参加しました!
A問題
何円安くなっているかを引き算で計算してそれが定価の何%に当たるか計算して出力すればいいですね.「割合」は小学5年生の算数で習います.
(私の解答)
A, B = map(int, input().split())
print(((A-B)/A)*100)
B問題
まず問題設定より,AiがXi以上である店iでは,高橋くんがその店にたどり着いたときにはスヌケマシンは売り切れてしまっています.このことに気をつけてすべての店についてスヌケマシンを買えるのか,買えるのであれば価格はいくらなのかを調べて最安値を出力すればいいです.
(私の解答)
N = int(input())
ans = 10000000000
for _ in range(N):
A, P, X = map(int, input().split())
if A >= X: continue
if P < ans: ans = P
if ans != 10000000000: print(ans)
else: print(-1)
私の解答ではどこの店でもスヌケマシンが買えない場合はans
が最後に10000000000
のままとなっていますのでそのようなときは-1
を出力するように書いています.
C問題
変数ans
をNとして,abと表すことのできる数を列挙していってNよりも小さいかどうかを判定していき,小さいならば順次ans
から1を引いていって,abがNよりも大きくなってしまったところで処理を終了してその時のans
を出力するという方針で解きました.
問題は「abと表すことのできる数を列挙」をどのように実現するかです.a, bそれぞれ2からスタートして1ずつ増やしながら列挙していけばよいでしょう.しかし,そのままやると途中で重複が起きてしまいます.たとえばa = 2, b = 4 のときab = 16ですがa = 4, b = 2のときもab = 16です.これに気をつけなければなりません.と,いうわけで一度出現した数を記録しておいて一度現れた数は飛ばしながら処理をすすめることにしましょう.aに代入する数がすでに出現している場合はbがどんな数でも*ab*はすでに出現していることを利用するなどして以下のように書きました.
(私の解答)
N = int(input())
ans = N
done = set()
for i in range(2,10**5+5):
if i**2 > N: break
if i in done: continue
j = 2
while 1:
if i**j > N: break
else:
done.add(i**j)
ans -= 1
j += 1
print(ans)
*ab*で表せる数がさほど多くないので普通に間に合います.
D問題
これは高校の数学Aの確率ですね完全に.高橋くんと青木くんの裏向きのカードの組み合わせとしてあり得るすべての場合の数,(9K-8)(9K-9)で高橋くんが勝つ組み合わせの数を割ればいいです.ここで数字が同じ2枚のカードは異なるものとして扱わなければなりませんね.
まず最初に1~9のカードがそれぞれ何枚が表向きに場に出ていないカードとして残っているかを計算しておいて,それに気をつけながら高橋くん,青木くんの裏側のカードの数字のすべての組み合わせ(9 × 9 = 81通り)についてそれぞれ検討していきます.気をつけることとしては例えば高橋くんと青木くんの裏向きになっているカードの数が同じである場合を検討するとき,そもそもその数字のカードが表向きでないものとして2枚以上残っていなければそのような場合は存在しないことになります.高橋くんが勝つ数字の組み合わせとなる場合の数を計算していってその総和を(9K-8)(9K-9)で割ったものが答えになりますね.
(私の解答)
K = int(input())
S = input()
S = list(map(int, list(S[:4])))
T = input()
T = list(map(int, list(T[:4])))
ST = S + T
left_card = [K]*9
for i in range(1,10): left_card[i-1] -= ST.count(i)
bumbo = (9*K - 8)*(9*K - 9)
bunshi = 0
for i in range(1,10):
if left_card[i-1] == 0: continue
for j in range(1,10):
if left_card[j-1] == 0: continue
S.append(i)
T.append(j)
Takahashi = 0
Aoki = 0
for k in range(1,10):
Takahashi += k*(10**S.count(k))
Aoki += k*(10**T.count(k))
if Takahashi > Aoki:
if i == j and left_card[i-1] == 1:
pass
elif i == j and left_card[i-1] != 1:
bunshi += left_card[i-1]*(left_card[i-1]-1)
else:
bunshi += left_card[i-1]*left_card[j-1]
S = S[:4]
T = T[:4]
print(bunshi/bumbo)
今回はアルゴリズムの力というか思い通りの処理を実装する力が問われるような問題でしたね(D問題までは).て,いうかAtCoderってすごく難しくてやっとD問題まで安定して解けるようになってきた~と思ったら次に待ち受けるのはDよりはるかに難しいE問題ですからね!?時間足りひん!!Eを解けるようになるにはA~Dを解き切る時間を超大幅に短縮する鍛錬を積むか,解けるはずのC,D問題を後回しにしてEに果敢に立ち向かうかしかないですね......