2017-06-09 84 views
-2
import sys 
trig = [] 
base, area = input().strip().split(' ') 
base, area = [int(base), int(area)] 
for i in range(1,area+1): 
    form = abs(((base*i)/2)-area) 
    trig.append(form) 

for i in range(1,area+1): 
    form = abs(((base*i)/2)-area) 
    if form == min(trig): 
     print(i) 

私は最初のforループから最小値を見つけようとしていますが、プログラムをより速く実行したいので、リストを使用しないでください。リストを使用せずにこれを行うにはどうすればよいですか?forループから最小値を見つける方法はありますか?

+0

私が間違っている場合は私を修正しますが、最初の値は常に最小のものではありません...? –

+3

ここでは正確に何を達成しようとしていますか? – zwer

+1

minの値を 'minTrig = min(trig)'のような変数に格納し、 'if form == minTrig:'でその値を使うことができます。これを行うことで、2回目のforループで毎回 'min()'を呼び出すことはありません。 – DarkCygnus

答えて

1

私は手足に行くと、あなたのコードから基づいて、欲しいものを推測しようとするでしょう - これは基本的にただ一つの変数を保持し、各ループ上の最小値をチェック(および必要に応じて、適宜更新)されます:

base, area = input().strip().split() 
base, area = int(base), int(area) 

min_pos = 1 
min_trig = abs(base/2 - area) # calculate the first immediately 
for i in range(2, area + 1): # loop from the second... 
    form = abs((base * i)/2 - area) 
    if form < min_trig: 
     min_pos = i 
     min_trig = form 

print(min_pos) 

UPDATE

コメントで述べたような一つの最小が存在する場合にのみ、それは正しいであろうように、上記は、単一の最小値のインデックスを見つけます。あなたが最小値のリストが必要な場合は、次のように行うことができます。

base, area = input().strip().split() 
base, area = int(base), int(area) 

min_pos = [1] # initialize the first index as a minimum immediately 
min_trig = abs(base/2 - area) # calculate the first trig as a minimum immediately 
for i in range(2, area + 1): # loop from the second... 
    trig = abs((base * i)/2 - area) 
    if trig == min_trig: 
     min_pos.append(i) 
    elif trig < min_trig: 
     min_pos = [i] 
     min_trig = trig 

print(min_pos) # prints you a list of all minimum positions 

あなたが別のリストにすべてのものを保存する必要はありませんもあなたは、二重ループを行う必要がありますこの方法。純粋なO(N)溶液。

+0

OPは最小値のすべての出現に対して(OPEN + 1)を望んでいたので、この解決法は機能しません。リストを最初に作成しなければならないので、これに対する最小時間の複雑な解はO(N)であり、最小値が見つかるはずである。 –

+1

Mea culpa、OPの心を読むことができなかった...彼はポジションを望んでいる。代わりmin_pos単一のインデックスを作るそれが配列の場合 – zwer

+0

は、それは複数の指標を考慮することができます。 'min_pos = i'を' min_pos.append(i) 'に変更してください。私は私のソリューションで非常に似たようなことをしました。それは未来を予測する力を持っていないとしてだけで単数ソリューションについては、上記の作品 - それを助けることはないだろう –

0

あなたのコードが今行っていることに基づいて、基本的に同じことをする別のバージョンのセグメントを作成しました。私は入力文字列"5 16"でそれをテストし、それが動作しているようだ。

import sys 
trig = [] 
base, area = input().strip().split(' ') 
base, area = [int(base), int(area)] 
minTrig = (base * area)/2 # set an upperbound on minTrig so that the max value in the trig array will be less than this value. 
for i in range(1,area+1): 
    form = abs(((base * i)/2) - area) 
    trig.append(form) 
    minTrig = min(minTrig, form) 
indices = [i + 1 for i, x in enumerate(trig) if x == minTrig] 
print(indices) 

をこれは最小数が発生するすべてのインデックスの新しい配列を作成するために、リスト内包を使用します。私は使用されるコードは、次の通りです。

最小値要素がすべて出現するコードは、hereです。

"5 16"でコードをテストすると、出力は[6, 7]になります。

関連する問題