類Runtime和火車運煤問題

2022-09-19 01:42:15 字數 2861 閱讀 1942

每個 j**a 應用程式都有乙個runtime類例項,使應用程式能夠與其執行的環境相連線。可以通過getruntime方法獲取當前執行時。

應用程式不能建立自己的 runtime 類例項。

你是山西的乙個煤老闆,你在礦區開採了有3000噸煤需要運送到市場上去賣,從你的礦區到市場有1000公里,你手裡有一列燒煤的火車,這個火車最多只能裝1000噸煤,且其能耗比較大——每一公里需要耗一噸煤。請問,作為乙個懂程式設計的煤老闆的你,你會怎麼運送才能運最多的煤到集市?

假設運到集市的煤的重量為left,我們可以假設火車在某處撿了left噸煤,則該問題可轉化為問題二:

條件:最大容量為capacity的火車,把煤運到pick_location處後,扔下left噸煤然後返回原地,剛好消耗掉min_coal噸煤。

問題一:根據left求min_coal。

問題二:根據min_coal求left。

我們先求取問題一

運left噸煤到集市,至少需要礦區煤的重量為min_coal = distance + 

min_coal(capacity, left, left)。

其中min_coal(capacity, pick_location, left)為問題一的解,表示最大容量為capacity的火車,把煤運到pick_location處後,扔下left噸煤然後返回原地,剛好消耗掉所有的煤的情況下,礦區的煤的最小重量min_coal。

1 left < 0時,min_coal = 0;

2 pick_location * 2 + left < capacity時,min_coal = pick_location * 2 + left

3 其他,min_coal = pick_location * 2 + min_coal(capacity, new_left/2, new_left)

其中new_left = pick_location * 2 + left - capacity,火車去時,在new_left/2處拿起new_left/2噸煤,然後在new_left處放下new_left噸煤,再在回來時,在new_left/2處拿起new_left/2噸煤。

根據該方案可求得:

left = 529時,礦區最少煤量為2989

即本題答案至少為529

對於問題二,假設礦區為a、集市為d,兩者之間有兩個點b、c可以存煤。

1 a區有煤3000噸,火車最大容量為1000,即需要從a出發三次,由於只有一列火車,需要回來二次。

2 b有煤2000噸,即需要從b出發二次,從c回到b一次。

3 c有煤1000噸,火車裝滿後直接奔赴d,只有一次。

即5ab=1000,3bc=1000,ab+bc+cd = 1000,即cd=7/15*1000,left = 8/15 * 1000=533

至於這裡為何在b處和c處出發時為1000,是因為出發時裝煤量為0~1000,而該線性問題,解為臨界值,不可能為0,只能為1000。

求得結果後代入驗證,發現533滿足題意,即該題的解至少為533。

也即,如果min_coal的值發生變化,left的值也會變化

min_coal = 2000, left = 1000 * (1/3) = 1000 * 1/3

min_coal = 3000, left = 1000 * (1/3 + 1/5 = 1000 * 8/15

min_coal = 4000, left = 1000 * (1/3 + 1/5 + 1/7) = 1000 * 71/105

min_coal = 5000, left = 1000 * (1/3 + 1/5 + 1/7 + 1/9) = 1000 * 248 / 315

但當min_coal = 7000時,按此公式計算的left > 1,也即最後可以運1000以上的煤到集市,這時就過了臨界值,需要用另乙個公式了。

該思路對另一種情況也需要重新考慮,礦區煤量不為整千,如min_coal = 3400時。

擴充套件問題:

1 耗煤量與載媒量有關時。

2 礦區總媒量變化的情況。

問題一**如下:

# 最大容量為capacity的火車,把煤運到distance處後,還剩下left噸煤。

# 返回值:煤的最小重量min_coal。

def train(distance, capacity, left):

if(left < 0):

return 0;

if(left < distance/3):

return distance + left * 3

return distance + min_coal(capacity, left, left)

# 最大容量為capacity的火車,把煤運到pick_location處後,扔下left噸煤然後返回原地,剛好消耗掉所有的煤

# 返回值:煤的最小噸數min_coal。

def min_coal(capacity, pick_location, left):

print "pick_location", pick_location

print "left: ", left

if(left < 0):

return 0

if(pick_location * 2 + left < capacity):

return pick_location * 2 + left

new_left = pick_location * 2 + left - capacity # 需要在路上撿new_left噸煤,最少得在new_left處撿

new_pick_location = new_left / 2

return pick_location * 2 + min_coal(capacity, new_pick_location, new_left)

火車運煤問題

本文章 xx公司的一道筆試題,煤礦有3000噸煤要拿到市場上賣,有一輛火車可以用來運煤,火車最多能裝1000噸煤,且火車本身需要燒煤做動力,每走1公里消耗1噸煤,如何運煤才能使得運到市場的煤最多,最多是多少?最優解 1,火車從煤礦出發3次,也即回來2次。這樣可以把3000噸都運出,回煤礦次數越多越費...

火車運煤問題

這個題的解答並不難,有很多都給出了答案,但是想說清楚道 理還是比較繞彎。如果想做程式設計做模擬,很簡單,但是一些邊界條件 中間過程都很繞,所以把這個不是程式設計題的程式設計題放在這裡解答一下,供參考。根據題意可知有三種運輸方式,分別是成本為5,成本為3,成本為1.下面簡稱t5,t3,t1.首先給出最...

火車運煤問題

這個可能是乙個比較經典的智力題了,和以前的那個 賽馬問題 很相似,其題目如下 你是山西的乙個煤老闆,你在礦區開採了有3000噸煤需要運送到市場上去賣,從你的礦區到市場有1000公里,你手裡有一列燒煤的火車,這個火車最多只能裝1000噸煤,且其能耗比較大 每一公里需要耗一噸煤。請問,作為乙個懂程式設計...