どうもこんにちは!
今週のコンテストはCまで完答、振り返りもCまで。
DはTLEになるコードを作った時点でほぼほぼタイムアップ。
問題と公式の解説のリンク
問題は以下のリンクから。
A - Scary Fee -
問題
預金xと1000円引き出すごとに引かれる手数料cが与えられます。(なおcの最大は999円。こんわっ・・・)
引き出しは1000円単位としたとき、引き出せる最大を出力する問題。
考え方とコード
ひとまず1円単位で引き落とせるとして、引き落とし金額と手数料込み込みでxを超えない最大値を計算し、100円台以下の端数を引いた値を出力するとしました。
x,c = map(int,input().split())
ans = x*1000//(1000+c)
print(ans - ans % 1000)
B - Locked Rooms -
問題
部屋が0,1,2,・・・,Nと1列に並び、部屋i-1とiの間にはドアiがあるとします。
与えられるのはドアの数Nとドアiの開閉情報です。
部屋0と部屋Nにそれぞれ人がいるとしたとき、どちらの人も入れない部屋数を出力するという問題。
なお、開閉情報は例えば0 1 0 0 0というように与えられ、1のドアは閉まっているとします。この例では部屋1と部屋2の間のドアが閉まっているとなります。
考え方とコード
シンプルに部屋0にいる人、部屋Nにいる人がいける部屋を探索して、残りの部屋の数を出力するとしました。
なお、部屋数は最大100なのでwhile文2回回したって大丈夫と思ってコーディングしましたが、もう少し簡略化できそうな気はします。
n = int(input())
s = [int(x) for x in input().split()]
l,r = 0, n-1
while True:
if l < n and s[l] == 0:
l += 1
else:
break
while True:
if 0 <= r and s[r] == 0:
r -= 1
else:
break
print(r-l if r > l else 0)
C - Lock All Doors -
問題
問題Bと同様にドアの数と各ドアの開閉情報が与えられます。加えて、部屋Rに人がいて、部屋を移動しながらすべてのドアを閉じるには何回開閉したらよいかを出力する問題。
考え方とコード
・両端から連続して閉じているドアは開閉不要として除外する
・初期の部屋Rから残りのドアを閉じていく際、道中ですでに閉じているドアは2回、開いているドアは1回閉じるとして合計を算出。(端のドアを閉じるためには、すでに閉まっているドアを1度開けて戻ってきて閉めるという動作が必要になるため)
n,r = map(int,input().split())
s = [int(x) for x in input().split()]
# 端のドアの閉じ数をカウント
lc, rc = 0,n-1
while True:
if lc < n and s[lc] == 1:
lc += 1
else:
break
while True:
if rc >= 0 and s[rc] == 1:
rc -= 1
else:
break
ans = 0
# 左側の回数の計算
for i in range(lc,r):
if s[i] == 1:
ans += 2
else:
ans += 1
# 右側の回数の計算
for i in range(r,rc+1):
if s[i] == 1:
ans += 2
else:
ans += 1
print(ans)
ではでは。