###やりたいこと
問.以下の問に答えなさい
あるスタート地点からゴール地点まで移動する車(P)がある.
この車の燃費は悪く1km移動するのに必要なガソリンは1Lである.
また途中で寄ることが出来るガソリンスタンドでは,
近年の中東問題の為決められた量のガソリンしか補給できない
この状況をもとに
「ガソリンを必要最低限補給したとき,ゴール地点で残っているガソリン量」
を出力しなさい.
##例
スタート地点からゴールまで10kmあり,最初車Pに入っているガソリンの量は4Lとする.
その道中に
1km地点のガソリンスタンドでは3L
4km地点のガソリンスタンドでは5L
7km地点のガソリンスタンドでは4L
だけ補給できる.
##流れ
1.1km地点のガソリンスタンドまで消費するガソリンは1L.よってこの時車Pに入っているガソリンは3L.
次のガソリンスタンドまでは足りるので,ここでは補給しない
2.4km地点のガソリンスタンドまで消費するガソリンは3L(1km地点のガソリンスタンドから考えて).
この時車Pに入っているガソリンは0L.次のガソリンスタンドまでは足りないので
このガソリンスタンドではガソリンを補給し,現在車Pに入っているガソリンは5L.
3.1km地点のガソリンスタンドまで消費するガソリンは3L(3km地点のガソリンスタンドから考えて).
この時車Pに入っているガソリンは2L.目的地までガソリンは足りないので,
このガソリンスタンドでも補給し現在車Pに入っているガソリンは6L.
4.7km地点のガソリンスタンドから10km地点まで必要なガソリン量は3L.
よってゴール地点に到達した時のこっているガソリンは3L.
よって「ガソリンを必要最低限補給したとき,ゴール地点で残っているガソリン量」は3L.
##但し以下の条件を満たさなければならない
1.目的地までの距離,最初車Pに入っているガソリン量,道中にあるガソリンスタンドの数は
上記例に従うと"10 4 3"
という文字列で入力し,ガソリンスタンドまでの距離,補給できるガソリン量は
上記例に従うと"1 3"
というように入力し,これを先ほど入力したガソリンスタンド数だけ入力する
2.車Pは無限にガソリンを補給できる
3.目的地までの最大距離は10万km,最初保有できるガソリン量は最大1万L,
道中にあるガソリンスタンドは最大1万店舗,
ガソリンスタンドは必ずスタートから目的地までの道中にあり,
各所ガソリンスタンドで補給できるガソリンの最大量は20万Lまでとする.
4.ガソリンスタンドでガソリンを補給する場合は必ず補給できる分だけ全て補給する.
また各ガソリンスタンドで補給できる回数は1回だけ.
5.もし目的地までガソリンがどうしても足りない場合,
"ガソリンが足りませんでした"
と出力する
##字数制限の関係で省略
###求めているもの
できれば自分でソースコードは考えたいので、誠に勝手ですが回答を求めるための
考え方だけご教授いただきたいと思います。
もし私の技術的に難しいものであれば、ソースコード付きで教えていただきたいです。
##過去ソースコードは字数削減の為削除しました
#追記
miyabi_sunのご回答から
1、現在の保有量で到達できるスタンドまで進む
2、到達できないスタンドが見つかれば、一番最後に利用したスタンド(もしくはスタート地点)
から到達できる最後のガソリンスタンドまでのリストを作成する
3、そのリストが1つでもあれば一番最後にいた地点からリスト内で最もガソリンを補給できるスタンドまで移動し、
移動した分のガソリンを引いたのち補給できるガソリンを補給する。そして1に戻る
4、もし先ほどのリストなければ既に通過したガソリンスタンドかつまだ利用していないガソリンスタンドのリストを作成する
5、利用していないスタンドのリストが一つでもあれば、リスト内のスタンドでガソリンを補給したこととし
現在のガソリン量に補給したガソリンを足す。これを最も多くガソリンを補給できるスタンドの中から順に行い、
現在地から先へ進めるか確かめる。進めるならば3と同じ補給と移動の計算を行い1へ
6、利用できるスタンドが一つもない、または通過したスタンド全てを利用してしまった場合ループを抜ける
7、これを目的地に到達するまで行う
というプログラムを組みましたが、まだエラーが発生しているようです。
python
1class oasisClass(): 2 def __init__(self,kyori,water): 3 self.kyori=kyori 4 self.water=water 5 def __lt__(self,other): 6 return self.kyori<other.kyori 7 def __repr__(self): 8 return repr((self.kyori,self.water)) 9 #--__repr__まで同じ 10 def __eq__(self,other): 11 if not isinstance(other,oasisClass): 12 return False 13 return self.kyori==other.kyori and self.water==other.water 14 def __hash__(self): 15 return hash(self.kyori) 16 17def looping(current_oasis,oasis_list,current,oasis_set):#前から順に現在地(ガソリンスタンドのインデックス),ガソリンスタンド全体のリスト(スタート地点とゴール地点も含めた),現在のスタートからの距離と 18 #現在保有しているガソリンの量を示すクラスオブジェクト,補給に使用したガソリンスタンドのset 19 loop_break=False 20 for p in range(current_oasis,len(oasis_list)):#現在地から 21 if current.water+current.kyori>=oasis_list[len(oasis_list)-1].kyori:#目的地につけるか 22 oasis_last=oasis_list[len(oasis_list)-1] 23 current_oasis=oasis_list.index(oasis_last) 24 current.water+=oasis_last.water-(oasis_last.kyori-current.kyori) 25 current.kyori=oasis_last.kyori 26 return len(oasis_set) 27 28 if current.water+current.kyori>=oasis_list[p].kyori:#次のガソリンスタンドまでたどり着けるなら 29 continue#さらに次のガソリンスタンドへ 30 else:#現在のガソリンではたどり着けないスタンドが見つかったら 31 pre_oasis_list=[oasis_list[j] for j in range(current_oasis,p) if current.water+current.kyori>=oasis_list[j].kyori and oasis_list[j] not in oasis_set] 32 #現在地点から到達可能地点までのガソリンスタンド 33 if len(pre_oasis_list)>0:#現在のガソリンでたどり着けるガソリンスタンドがあれば 34 pre_oasis_list2=sorted(pre_oasis_list,key=lambda k:k.water)#ガソリン補給量の多い順にソート 35 pre_oasis_last=pre_oasis_list2[len(pre_oasis_list2)-1] 36 current_oasis=oasis_list.index(pre_oasis_last)#利用したガソリンスタンドのインデックスを検索 37 #ガソリンスタンドで補給した量からそれまでの距離で引く 38 current.water+=pre_oasis_last.water-(pre_oasis_last.kyori-current.kyori) 39 #スタート地点からの距離を代入 40 current.kyori=pre_oasis_last.kyori 41 #利用したガソリンスタンドをsetがたに保存 42 oasis_set.add(pre_oasis_last) 43 break 44 #ここで次のループに入る 45 else:#到達できるところがない場合 46 #既に通過したスタンドかつまだ利用していないところから補給する 47 pre_oasis_list2=[oasis_list[j] for j in range(1,current_oasis) if oasis_list[j] not in oasis_set] 48 pre_oasis_list2.sort(key=lambda u:u.water) 49 pre_all=0 50 if len(pre_oasis_list2)>0:#まだ補給していないところがあれば 51 for idx,h in enumerate(reversed(pre_oasis_list2)): 52 pre_all+=h.water#他のガソリンスタンドにもよる可能性があるのでいったん貯める 53 if pre_all+current.water+current.kyori>=oasis_list[len(oasis_list)-1].kyori:#ためたガソリンで目的地にまで到達すれば 54 oasis_last=oasis_list[len(oasis_list)-1] 55 current.water+=pre_all#ためたガソリンを補給 56 oasis_set.add(h)#利用したガソリンスタンドとして保存 57 current.water+=oasis_last.water-(oasis_list_last.kyori-current.kyori) 58 current.kyori=oasis_last.kyori 59 current_oasis=oasis_list.index(oasis_last) 60 return len(oasis_set) 61 62 if pre_all+current.water+current.kyori>=oasis_list[p].kyori:#ためたガソリンで次の目的地にまで到達すれば 63 #それまで貯めたガソリンを貯蓄 64 #利用したスタンドとして保存 65 current.water+=pre_all 66 oasis_set.add(h) 67 #ここからは次の地点に到達したものとして処理 68 current.water+=oasis_list[p].water-(oasis_list[p].kyori-current.kyori) 69 current.kyori=oasis_list[p].kyori 70 current_oasis=oasis_list.index(oasis_list[p]) 71 oasis_set.add(oasis_list[p]) 72 break 73 elif idx==0:#全てのスタンドを利用しても到達しなければ 74 loop_break=True#全てのループを抜ける 75 break 76 else:#全てのスタンを利用していないが到達していない場合 77 oasis_set.add(h)#利用したスタンドとして保存 78 continue 79 else: 80 break 81 else:#全てのガソリンスタンドを既に利用していたら 82 loop_break=True 83 break 84 85 if loop_break==False:#再ループ 86 return looping(current_oasis,oasis_list,current,oasis_set) 87 else: 88 return 0 89 90 91input_line = input() 92kyori0_saisyoryo1_oasiskazu2=input_line.split(" ") 93kyori=int(kyori0_saisyoryo1_oasiskazu2[0]) 94ryo=int(kyori0_saisyoryo1_oasiskazu2[1]) 95oasis=int(kyori0_saisyoryo1_oasiskazu2[2]) 96 97pre_oasis_list=[oasisClass(0,ryo)] 98for i in range(oasis): 99 input_line=input().split(" ") 100 pre_oasis_list.append(oasisClass(int(input_line[0]),int(input_line[1]))) 101pre_oasis_list.append(oasisClass(int(kyori),0)) 102oasis_list=sorted(pre_oasis_list) 103#input_lineからoasis_list=sorted...まで一緒 104 105current=oasisClass(pre_oasis_list[0].kyori,pre_oasis_list[0].water)#現在地と現在のガソリン量 106current_oasis=1#ガソリンスタンド全体のインデックス番号 107oasis_set={oasis_list[0]}#最初のスタート地点を既に利用したものとして保存 108print(looping(current_oasis,oasis_list,current,oasis_set)-1) 109
回答4件
あなたの回答
tips
プレビュー