0
0

More than 1 year has passed since last update.

AtCoder ABC220 挑戦! (Python)

Posted at

茶色コーダーを目指して、ABC220に、コンテスト2回目の挑戦です。

ABC220A
A, B, C=map(int, input().split())
Flag=False #倍数が見つかるかどうかのフラグ
for i in range(1001):
    if A<=C*i<=B:
        print(C*i)
        Flag=True
        break
    else:
        pass

if Flag==False:
    print('-1')
else:
    pass

A問題にしては、記述量が多かった気がする。

ABC220B
K=int(input())
#K進法表記のA, B
A, B=map(int, input().split())
# print(K, A, B)

# K進法から、10進法への変換
# int関数の2つ目の引数に整数を指定すると、基数を指定できる。
# print(int(str(A), K))
# print(int(str(B), K))
A_K_10=int(str(A), K)
B_K_10=int(str(B), K)

print(A_K_10*B_K_10)

B問題は、K進法から、10進法への変換の問題。
int()の2つ目の引数に基数を指定すれば、10進数に戻せる。
本当は、int()関数じゃなくて、自分で導出することを意図した問題な気はする。本などで別途アルゴリズム勉強するので、今回は勘弁勘弁。

ABC220C
N=int(input())
A_list=list(map(int, input().split()))
X=int(input())

#繰り返し単位Aの合計を求めておく
A_list_sum=sum(A_list)

#求めたい答えは、XをAの合計で割った商*Nと足りない分の項目数なので、
#整数除算で商を求める。
quotient_X=X//A_list_sum #商: quotient 
#余り
mod_X=X % A_list_sum

k=0 #項目数のカウンター。初期化
sum_k=0 #kまでの合計。 初期化

#余りを、越えるまで、項目数を数えていく。
for i in range(N):
    sum_k+=A_list[i] #i番目を足していく
    k+=1 #項目のカウント
    if mod_X<sum_k:
        break
    else:
        pass
print(quotient_X*N+k)

肝心のC問題。今回は、前回に比べると、だいぶ簡単だった。
ポイントは、まずあらかじめXをA_listの合計で割って商を出しておいて、その余りについて、超えるまで、項目数を数えること。

ここまでで、40分ほど。

時間が1時間ほど余ったので、欲をかいてD問題に突入してみた。
問題の意味は理解でき、操作F, Gは実装できたが、なぜか途中のエラーが取り除けず、タイムアップ。
Dについては、他の人の回答見て勉強させてもらおう。bit全探索とか使いそうやなーと思ったけどどうなんだろうか。

今回も、C問題までACすることができてよかった。
反省としては、B問題で、int()を使ってしまったので、基本のn進数の変換については、勉強して自分で実装できるようにしたいと思う。

下記の本で勉強していく予定。
Pythonではじめるアルゴリズム入門 (翔泳社)

来週も頑張りましょう。お疲れさまでした。

0
0
1

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
0
0