1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

AtCoder参加したったー(ABC193編)

Last updated at Posted at 2021-02-28

こんにちは!バイオインフォマティクス系オタク修士学生のroadricefieldです!AtCoder ABC193参加しました!

A問題

何円安くなっているかを引き算で計算してそれが定価の何%に当たるか計算して出力すればいいですね.「割合」は小学5年生の算数で習います.

(私の解答)

A, B = map(int, input().split())
print(((A-B)/A)*100)

B問題

まず問題設定より,AiXi以上である店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問題

変数ansNとして,abと表すことのできる数を列挙していってNよりも小さいかどうかを判定していき,小さいならば順次ansから1を引いていって,abNよりも大きくなってしまったところで処理を終了してその時の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に果敢に立ち向かうかしかないですね......

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?