問題)
二つの風呂 A,B に、特別なルールで水を貯めていくゲーム
Aの風呂には、あらかじめ、s リットルの水が含まれている。
A,B それぞれの風呂の容量は, a,b である。
入力値
s, a, b
条件
すべてのテストケースにおいて、以下の条件をみたします。
・1 ≦ S ≦ 1,000,000
・1 ≦ a, b ≦ 1,000,000
・a ≧ S + 10 ・すなわち、 風呂A には必ず 1 回以上水を行われる。
以下のルールに従って、水を貯めていく。
あらかじめ、s リットル入っているAの風呂に、10リットル の水をためる
次に、Bに (s + 10) リットルの 水を貯める
そして、A、B 交互に 1,010 リットル ずつの水を交互に入れる
水を入れ続け、溢れた方が負けである。
出力値には、勝った方の、すなわち溢れなかった方の風呂の名前と、
相手が溢れた直前に入れた、勝者の水の量を求めたい。
入力例1
1 1500 2050
出力例1
B 2021
入力例2
10 50 1019
出力例2
A 20
コード 入力例1 1 1500 2050 出力例1 B 2021 上記の入力値の場合、A,Bの風呂に入れる水の量は以下のような等差数列になる Aの第1項、2項を除き、1010ずる増える A: 1 11 1021 2031 3041 4051 5061 B: 1011 2021 3031 4041 5051 6061 入力例2 10 50 1019 出力例2 A 20 A: 10 20 1030 2040 3050 4060 B: 1020 2030 3040 4050 5060 s,a,b = map(int, input().split()) print(s,a,b) #等差数列の項数が不明だが、n= 10 と仮定 l_1 = s+10 l_2 = s+1010 m = 1010 n = 10 #A,B の等差数列 lst_a = list(range(l_1, l_1+m*n, m)) lst_a.insert(0,s) lst_b = list(range(l_2, l_2+m*n, m))
#質問
今回の問題だと、等差数列の項数が不明のため式を作成できない
更に、ひとつの風呂の限界値は求められるが、ふたつ交互に入れていく場合の式が作れない
アドバイス等頂けたら嬉しいです。
#試したこと
コード s,a,b = map(int, input().split()) print(s,a,b) #等差数列の項数が不明だが、n= 10 と仮定 l_1 = s+10 l_2 = s+1010 m = 1010 n = 10 #A,B の等差数列 lst_a = list(range(l_1, l_1+m*n, m)) lst_a.insert(0,s) lst_b = list(range(l_2, l_2+m*n, m)) #1つの風呂の溢れる前の、入れた水の量を出力 for x in range(n): if lst_a[x] > a: break print(lst_a[x-1])
#追記質問
配列ではなく、while構文を利用するようにとアドバイスをいただきました。
A、B それぞれにwhile構文を使い、それぞれの浴槽の水が溢れる直前に入れた水の量を表示できた。
しかし、ルール上にあるように交互に入れた際の、勝った相手のみ表示させたい。
二つの条件を合わせたwhile文が書けません。
アドバイス等頂きたいです。
#追記条件
加えて、入力値の条件を追記しました。
入力値
s, a, b
条件
すべてのテストケースにおいて、以下の条件をみたします。
・1 ≦ S ≦ 1,000,000
・1 ≦ a, b ≦ 1,000,000
・a ≧ S + 10 ・すなわち、 風呂A には必ず 1 回以上水を行われる。
コード s,a,b = map(int, input().split()) print(s,a,b) #Aの一回目 water_a = s+10 #Bの一回目 water_b = s+1010 #Bの一回目が限界値を越えていたら、Aの勝利 if water_b > b: print("A" + " " + water_a) #上記以降は交互に入れる else: while water_a < a: water_a += 1010 print(water_a) break #Bの一回目はクリアしたため、順次 1010リットルずつ足していく while water_b < b: water_b += 1010 print(water_b) break #出力値 1021 2021
回答4件
あなたの回答
tips
プレビュー