每個 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噸煤,且其能耗比較大 每一公里需要耗一噸煤。請問,作為乙個懂程式設計...