金环(2017佛山市选拔初中组)
金環(2017佛山市選拔初中組)
題目描述
小月亮到達了一個城市并住在一個賓館。她沒有錢了,但是過了N天,她就會收到一大筆錢。但是她有一條由N個金環串成的金鏈。小月亮必須每天付1個金環給商家,但是她可以一次付多個金環同時收到多個金環作為找的錢,前提是這些找回的金環必須是她在此之前付給商家的。當她收到那一大筆錢時,她就會把她的金鏈贖回來。小月亮喜歡她的金鏈,所以想盡可能少地切斷金環來支付給商家。(原來金鏈的每個金環是環環相扣形成一個鏈,而不是環)請幫幫她。舉個例子,當N=5的時候,她必須切斷第2個金環,使得項鏈變為1,1,3,三個部分。第一天,她給商家一個金環。第二天,她也給了商家一個金環。此時她手里有一段由3個金環構成的金鏈,在第三天給商家這段金鏈后,商家把前面小月亮給的2個金環作為找的零錢。第4,5天她就會每天付給商家1個金環。假設小月亮可以選擇商家找零的方式。
輸入格式?1754.in
一個數字N(1 <= N <= 10^16)。
輸出格式?1754.out
一個整數(最少需要切斷幾個金環)
輸入樣例?1754.in
9
輸出樣例?1754.out
2
【提示】
可以斷開第二個和第六個金環
?
?
這題的代碼量雖然很少,但是要想出來比較困難,是周老師教我們的。
設X為斷開的珠子數量。
因此,我們其實可以事先確定斷的金環個數(設為x),那么后面每段的長度分別為x+1,2x+2,4x+4……將這些段的長度都加起來
當我們把它斷出一個時,剩下的就會有2份;斷出兩個時,就會剩下3份;斷出三個時,就會剩下4份。
?
批注:O為珠子,由/斷開。
?? ?所以段的數量為X+1。
主代碼
?
for(int i=1; ;i++){long long sum=0,k=2;for(int j=1;j<=i+1;j++){if(j==1) sum+=i;else{sum+=i*k+k;k=k*2;}}if(n<=sum) {ans=i;break;}}cout<<ans<<endl;?
?
轉載于:https://www.cnblogs.com/yiyiyizqy/p/7397084.html
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的金环(2017佛山市选拔初中组)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android Studio检测内存泄露
- 下一篇: 「HDU6158」 The Design