演算法之穿越沙漠 獄吏問題

2021-10-03 02:30:26 字數 3111 閱讀 7467

一輛吉普車來到1000km寬的沙漠邊沿。吉普車的耗油量為1l/km,**油量為500l。顯然,吉普車必須用自身油箱中的油在沙漠中設幾個臨時 加油點,否則是通不過沙漠的。假設在沙漠邊沿有充足的汽油可供使用,那麼吉普車應在哪些地方、建多大的臨的加油點,才能以最少的油耗穿過這塊沙漠?

從這個題目來看,這是乙個極限問題,求得是最少耗油的量,所以只有唯一答案。

1、為了穿越這個沙漠,同時耗油量最少,那麼吉普車就應該每次出發的時候都要滿油量出發。

2、為了保證每一次都是滿油量的從每個臨時加油站出發,那麼每乙個臨時加油站的油量儲備都應該是500l的倍數。

3、為了保證耗油量最少,每一次建立乙個臨時加油站的時候,運輸的次數也是越少越好,減少重複的路段。

4、如果這道題通過遞推法正推的話很難確定第乙個臨時加油站的地點。

5、所以這裡我們用倒推法來做。

6、假設我們已經到達了b點,這個時候b點的儲油量應該0,這是可以倒推c1點的儲油量應該為500l,這時候可以剛好到達終點b。好了現在我們知道c1點的儲油量了,也就知道了c1到b點的距離為500公尺。

7、這時候我們應該想,如果向c1點運輸500l的油量,c2點應該儲存多少油呢?根據上面的步驟2(臨時加油站的油量儲備都應該是500l的倍數)和步驟3(運輸的次數也是越少越好,這裡肯定是兩次或者兩次以上才能向c1點運輸500l油,這裡取2次),那麼我們就知道了c2點的儲油量應該是500l*2,也就是1000l油。這時,c2到c1的距離為500/3。

8、如果想c2點運輸1000l的油,重複步驟7可知,c3點儲存油量為500×3l,c3到c2的距離為500/5。

9、所以到達臨時加油站cn的時候,儲油量應該是500×n,cn到cn-1的距離為500/2n-1。

所以這裡通過下面這個式子算出n:

500+500/3+500/5+500/(2n-1) = 1000;

然後就可以得出最少耗油量。

public

class

desert

//需要設定補給站點,每個站點的儲存量為單次的最大負載的整數倍

double dis=distance;

int i=0;

//站點個數

while

(dis < totaldistance)

int num=i;

double totaloil =0;

while

(i>0)

system.out.

println

("第"

+(num-i)

+"個站點為距離起點"

+(totaldistance-dis)

+"處,儲存量為"

+oilper*i+

"l");}

system.out.

println

("總耗油量為"

+totaloil+

"l");}

public

static

void

main

(string[

] args)

}

第1個站點為距離起點22.433122433122435處,儲存量為3000.0l

第2個站點為距離起點60.89466089466089處,儲存量為2500.0l

第3個站點為距離起點106.34920634920638處,儲存量為2000.0l

第4個站點為距離起點161.90476190476193處,儲存量為1500.0l

第5個站點為距離起點233.33333333333337處,儲存量為1000.0l

第6個站點為距離起點333.33333333333337處,儲存量為500.0l

第7個站點為距離起點500.0處,儲存量為0.0l

總耗油量為3291.630591630592l

某王國對囚犯進行大赦,讓一獄吏n次通過一排鎖著的n間牢房,每通過一次按所定規則轉動門鎖,每轉動一次,原來鎖著的被開啟,原來開啟的被鎖上;通過n次後,門鎖開著的,牢房中的犯人放出,否則犯人不得獲釋.轉動門鎖的規則是這樣的,第一次通過牢房,要轉動每一把門鎖,即把全部鎖開啟;第二次通過牢房時,從第二間開始轉動,每隔一間轉動一次;第k次通過牢房,從第k間開始轉動,每隔k-1 間轉動一次;問通過n次後,哪些牢房的鎖仍然是開啟的?

牢房可以視作乙個一元陣列,1代表鎖著,0代表開鎖。

規律:當鎖的標號為乙個數的平方時,那麼最後它會開著。

public

class

warder

system.out.

println

("牢房數為"

+n+"時");

int k,j;

for(i=

1;i<=n;i++

)else

}for

(j=0

;jsystem.out.

println

("是開鎖的");

}}public

void

lawwarder

(int n)

} system.out.

println

("是開鎖的");

}public

static

void

main

(string[

] args)

}

暴力法

牢房數為10時

第1次通過牢房1、2、3、4、5、6、7、8、9、10、是開鎖的

第2次通過牢房1、3、5、7、9、是開鎖的

第3次通過牢房1、5、6、7、是開鎖的

第4次通過牢房1、4、5、6、7、8、是開鎖的

第5次通過牢房1、4、6、7、8、10、是開鎖的

第6次通過牢房1、4、7、8、10、是開鎖的

第7次通過牢房1、4、8、10、是開鎖的

第8次通過牢房1、4、10、是開鎖的

第9次通過牢房1、4、9、10、是開鎖的

第10次通過牢房1、4、9、是開鎖的

規律法牢房數為10時

1、4、9、是開鎖的

遞推法 穿越沙漠問題

吉普車試圖穿越 x km 寬的沙漠,吉普車耗油率1l km,油量 500l,對於 x 500,吉普車需要設定臨時儲油點,以穿越沙漠。現在,我們需要對於輸入的 x 值,計算最少的耗油量。其中,0 x 3000.在思考這道題之前,我們先考慮幾個常識性問題 1 越往沙漠深處的儲油點送油,所消耗的油量更多 ...

穿越沙漠問題,飛機加油問題

一輛吉普車來到1000km寬的沙漠邊沿。吉普車的耗油量為1l km,油量為500l。顯然,吉普車必須用自身油箱中的油在沙漠中設幾個臨時 加油點,否則是通不過沙漠的。假設在沙漠邊沿有充足的汽油可供使用,那麼吉普車應在哪些地方 建多大的臨的加油點,才能以最少的油耗穿過這塊沙漠?本題是乙個極值問題,要求具...

C語言問題之穿越雷區

x星的坦克戰車很奇怪,它必須交替的穿越正能量輻射區和負能量輻射區才能正常運轉,否則將報廢。某坦克需要從a區到b區去 a,b區本身是安全去,其它區都標了正號或負號分別表示正負能量輻射區。例如 a b 坦克只能水平或垂直方向上移動到相鄰的區。資料格式要求 輸入第一行是乙個整數n,表示方陣的大小,4 n ...