1093 駱駝和香蕉
基準時間限制:1 秒 空間限制:131072 kb 分值: 40
難度:4級演算法題
乙隻駱駝每次最多負重k只香蕉,而它每走1公里要吃掉1只香蕉,不吃完不肯走。現在這只駱駝要去到n公里以外的地方,如果n > k,那麼即使駱駝裝滿了香蕉,也無法1次走到目的地,不過駱駝可以在中途設定一些補給點,先把一些香蕉運過去,下次經過時可以在這些地方進行補給。這樣一來便能走到距離 > k的地方。現在給出n和k,問駱駝走到目的地最少需要消耗多少香蕉。
input
2個整數n k,中間用空格分隔。(1 <= n, k <= 10000,n <= 5 * k)output
輸出最少需要消耗多少根香蕉。input示例
1000 500output示例
3837題解:
對於nk時香蕉不可能一步送到,那怎麼辦?就需要乙個「中轉
站」來儲存香蕉,
那麼中轉站的位置該怎麼選?
------很顯然,我們可以將問題轉化一下:如何將k根香蕉運送到a點?其中a==n-k,我們假設a比較小以至於剛
剛只需要乙個補給點a且只來回一次,
這樣在路途中總消耗的香蕉為3*a個,因為最終a點要有k根香蕉,且駱駝每次
運輸量至多為k,所以有k+3*a<=2*k → a<=k/3,(其中k+3*a便是答案)
顯然當a<=k/3剛好滿足假設中的要求,
也就是說n>k+k/3時就需要2個中轉站且來回兩次了
------如果n>k+k/3怎麼辦?可以將問題繼續轉化,如何將k+3*(k/3)(==2*k)根香蕉運送到b點?其中b==n-k-k/3!
同樣假設只需要兩個補給點a和b且只來回
兩次,根據上面的套路仍可列方程2*k+5*b<=3*k → b<=k/5 (其中2*k+5*b
便是答案)
……兩個中轉點還不夠!繼續轉化:如何將2*k+5*(b/5)(==3*k)根香蕉運送到c點? 同理有方程
3*k+7*c<=4*k(其中3*k+7*b便是答案) ……
如果一直這樣迴圈下去,則說明不可能送到!否則總有解,答案便是x*k+(2*x+1)*pi,其中pi表示第pi個中轉站
與起點間的距離
#include#includeusing namespace std;
int main(void)
if(n>0)
ans += n*tis;
printf("%.0f\n", ceil(ans));
return 0;
}
駱駝和香蕉 51Nod 1093
既然要設立中轉點 那每個點被經過的次數肯定是單增的 且一定時奇數 因為最後一趟沒有回程 然後就想不動了。其實還可以停在非整數點 題解其實就是逆向遞推 不斷將問題轉換 include using namespace std const double eps 1e 6 int main if n eps...
51nod 猴猴吃香蕉 揹包
猴猴最愛吃香蕉了。每天猴猴出門都會摘很多很多的香蕉,每個香蕉都有乙個甜度,猴猴不一定要把所有的香蕉都吃掉,猴猴每天都有乙個心情值k,猴猴希望當天吃的香蕉滿足這麼乙個條件,這些香蕉的甜度乘積恰好等於k,但是猴猴並不知道有多少種方法,於是猴猴把這個問題交給你。m 1 08 m leq 10 8 m 10...
51nod 1394 差和問題
1394 差和問題 基準時間限制 1 秒 空間限制 131072 kb 分值 80 難度 5級演算法題 有乙個集合s,初始狀態下有n個元素,對他進行如下操作 1 向s裡面新增乙個值為v的元素。輸入格式為1 v 2 向s裡面刪除乙個值為v的元素。輸入格式為2 v 3 詢問s裡面的元素兩兩之差絕對值之和...