0
1

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 ABC223 挑戦!(Python)

Last updated at Posted at 2021-10-17

ABC223、コンテスト5回目の挑戦です。
なんとかC問題まで完答できました。
前回はさぼりです。プロ野球が熱戦のため、阪神の優勝条件をpythonで計算してました。

ABC223A
#100円×1-10までありうる。
X=int(input())

X_list=[i*100 for i in range(1, 11)]
# print(X_list)

#X_listの中にXが存在するかを判定する。
if X in X_list:
    print('Yes')
else:
    print('No')

ありうるXのリストを準備して、それが一致するかを判定。
リスト内包表記が無理せず使えるようになってきた。

ABC223B
S=input()
S_list=[]
for i in S:
    S_list.append(i)
#循環する文字列をどこで切るか
#ありうる文字列をすべて列挙したうえで、並び替える必要がある。
#ありうる文字列の数は、len(S)個。
S_i=''
S_list_set=[]#シフトでありうる文字列を格納
for i in range(len(S)):
    S_i=''#初期化
    for j in range(len(S)):
        if i+j<len(S):
            S_i+=S_list[i+j]
        else:
            S_i+=S[(i+j)-len(S)]
    # print(S_i)
    S_list_set.append(S_i)

# print(S_list_set)

#リストを辞書順に並び替え
S_list_set=sorted(S_list_set)
print(S_list_set[0])
print(S_list_set[-1])

シフト操作で作れる文字列を列挙して、sortedで辞書順に並べた後に、最初と最後を出力すればいい。
ありうる文字列は、循環する文字列と考えたときに、どこで切るか、のlen(S)通りある。切った後の文字は、(i+j)-len(S)番目を持ってくればよい。ここの指定が難しく、時間がかかった。
循環する文字列の取り出しは、なんかうまくできそうだったけど、泥臭くやってしまった。うまい方法がありそうなので要勉強。

ABC223C
N=int(input())
#長さAi 1秒あたりBi で燃える。
A_B_list=[]
for i in range(N):
    A=''
    B=''#初期化
    A,B=map(int, input().split())
    A_B_list.append([A,B])
# print(A_B_list)

#両端で火をつけたときにかかる秒数は、
#片端から火をつけたときの半分である。

sum_A_B=0#両端から火をつけたときのかかる合計秒数
for i in range(N):
    #i本目を燃やすのにかかる秒数は、A/B, 両端からなので2で割る。
    sum_A_B+=(A_B_list[i][0]/A_B_list[i][1])/2

# print(sum_A_B)#かかる秒数
#その秒数を左端から計算して、燃え切る地点を出せばよい。

seconds=0#左端から燃やした時の累計秒数
length=0#左端からの長さ
#秒数が同じになるまで、長さを足していく。if文で

for i in range(N):
    seconds+=A_B_list[i][0]/A_B_list[i][1]#i本目を燃やすときの秒数
    if seconds<=sum_A_B:
        length+=A_B_list[i][0]
        pass
    else:
        #秒数から、i番目の秒数を引く。i本目は、左端からのみでは、燃え切らない。
        seconds-=A_B_list[i][0]/A_B_list[i][1]
        #残りの秒数
        remain=sum_A_B-seconds
        #燃える長さ
        length+=A_B_list[i][1]*remain
        #ループを抜ける。
        break

print(length)

導火線に両端に火をつけたときの、左端からの長さを求める問題。
一見複雑そうだが、よく考えてみると意外とシンプルだった。

ポイントは、両端から火をつけたときにかかる秒数は、片端から火をつけたときの半分であるということ。

よって、燃えるのにかかる秒数は求まるので、あとは左端から長さをかかる秒数に達するまで足していく。
ただし、左端のみで完全に燃えきらない最後のi本目については、if文で処理した。

B問題で思いのほか時間がとられて、C問題は40分くらいしかなくてぎりぎりだったが、なんとかACすることができてよかった。

お疲れさまでした。

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?