ABC223、コンテスト5回目の挑戦です。
なんとかC問題まで完答できました。
前回はさぼりです。プロ野球が熱戦のため、阪神の優勝条件をpythonで計算してました。
#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のリストを準備して、それが一致するかを判定。
リスト内包表記が無理せず使えるようになってきた。
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)番目を持ってくればよい。ここの指定が難しく、時間がかかった。
循環する文字列の取り出しは、なんかうまくできそうだったけど、泥臭くやってしまった。うまい方法がありそうなので要勉強。
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することができてよかった。
お疲れさまでした。