質問編集履歴

1 追記質問

python3_beginer

python3_beginer score 38

2018/05/06 23:55  投稿

Python3 等差数列 項数が不明の場合
問題)
二つの風呂 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  
 
```
  • Python 3.x

    9765 questions

    Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る