運煤和火柴棒

2021-06-27 09:39:17 字數 1791 閱讀 9626

1.     這個可能是乙個比較經典的智力題了,和以前的那個《賽馬問題》很相似,其題目如下:

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

這道題一開始看上去好像是無解的,因為你的火車每一公里就要消耗一噸煤,而到目的地有1000公里,而火車最多只能裝1000噸媒。如果你的火車可以全部裝下,到目的地也會被全部燒光,一丁點也不剩。所以,很多人的第一反應都是覺得這個不太可能。

如果你一開始就覺得不太可能的話,這是很正常的。不過我不知道你還會不會繼續思考下去,如果你不想思考下去了,那麼我很為你擔憂,因為你可能並不是乙個不善於思考的人,而是乙個畏難的人,還有可能是乙個容易放棄的人。這對於你做好 乙個需要大量思考的工作的程式設計師來說可能並不適合。

我一開始也覺得不可能,後來想了一想,想到乙個解法可以最多運送500噸煤到市場,方法如下:(希望你先自己想一想再檢視這個答案)

首先想到最優解的兩個特徵:1,火車肯定要從起點出發3次(因為每次最多運1000);2,火車前兩次回到起點要用完車上存煤(否則是浪費)。

初步方案:火車前兩次都運到某點x,卸下1000-2x,然後用x煤回去,第三次到x點時,車上有1000-x,然後裝上x點的煤,若3000-5x不超過1000,直接到終點,用3000-5x=1000的臨界條件算得x=400,這也是火車到達終點所剩下的煤。

若3000-5x超過1000,此時與原問題類似,但初始煤變為3000-5x,路程變為1000-x,我們需要選擇下乙個存煤點,與x點距離y,然後在y點回頭一次。

然後想到第三個特徵:3,火車回程要盡可能短。使火車回頭的原因是火車容量為1000,理想狀況為火車每次出發都裝滿1000的煤,所以火車第三次到達x點時共有煤3000-5x=2000,求得x=200;火車第二次到達y點時站點有存煤1000-2y,火車有煤1000-y,共計2000-3y,理想狀況為2000-3y=1000,y=333,火車到達終點剩下煤1000-(1000-x-y)=533。

2 有時候,有些面試題是很是無厘頭,這不,又有乙個,還記得小時候玩的的「火柴棍遊戲」嗎,就是移動一根火柴棍改變乙個圖或字的遊戲。程式面試居然也可以這麼玩,看看下面這個火柴棍式的程式面試題吧。

下面是乙個c程式,其想要輸出20個減號,不過,粗心的程式設計師把**寫錯了,你需要把下面的**修改正確,不過,你只能增加或是修改其中的乙個字元,請你給出三種答案

[cpp]view plain

copy

print

?intn = 20;   

for(

inti = 0; i 

不過,我要告訴你,以上這些答案都不對(我就知道你會偷看答案的),不過,順著這些思路走很接近了。呵呵。

下面是正確答案——

[cpp]view plain

copy

print

?//第一種解法:在for迴圈中給 i 加乙個負號 for(int i = 0; -i 

[cpp]view plain

copy

print

?//第二種解法:在for迴圈中把 i-- 變成 n-- for(int i = 0; i 

[cpp]view plain

copy

print

?//第三種解法:把for迴圈中的 

其它相關的變種題如下:

火柴棒等式

題目描述 給你n根火柴棍,你可以拼出多少個形如 a b c 的等式?等式中的a b c是用火柴棍拼出的整數 若該數非零,則最高位不能是0 用火柴棍拼數字0 9的拼法如圖所示 注意 加號與等號各自需要兩根火柴棍 如果a b,則a b c與b a c視為不同的等式 a b c 0 n根火柴棍必須全部用上...

火柴棒等式

description 給你n根火柴棍,你可以拼出多少個形如 a b c 的等式?等式中的a b c是用火柴棍拼出的整數 若該數非零,則最高位不能是0 用火柴棍拼數字0 9的拼法如圖所示 注意 1.加號與等號各自需要兩根火柴棍 2.如果a b,則a b c與b a c視為不同的等式 a b c 0 ...

火柴棒等式

給你n根火柴棍,你可以拼出多少個形如 a b ca b c 的等式?等式中的 aa bb cc 是用火柴棍拼出的整數 若該數非零,則最高位不能是 00 用火柴棍拼數字 0 90 9 的拼法如圖所示 注意 加號與等號各自需要兩根火柴棍 如果 a ba b 則 a b ca b c 與 b a cb a...