hdu 2013 蟠桃记-递推-[解题报告]C++
生活随笔
收集整理的這篇文章主要介紹了
hdu 2013 蟠桃记-递推-[解题报告]C++
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
蟠桃記
問(wèn)題描述 :
喜歡西游記的同學(xué)肯定都知道悟空偷吃蟠桃的故事,你們一定都覺(jué)得這猴子太鬧騰了,其實(shí)你們是有所不知:悟空是在研究一個(gè)數(shù)學(xué)問(wèn)題!什么問(wèn)題?他研究的問(wèn)題是蟠桃一共有多少個(gè)!
不過(guò),到最后,他還是沒(méi)能解決這個(gè)難題,呵呵^-^
當(dāng)時(shí)的情況是這樣的:
第一天悟空吃掉桃子總數(shù)一半多一個(gè),第二天又將剩下的桃子吃掉一半多一個(gè),以后每天吃掉前一天剩下的一半多一個(gè),到第n天準(zhǔn)備吃的時(shí)候只剩下一個(gè)桃子。聰明的你,請(qǐng)幫悟空算一下,他第一天開(kāi)始吃的時(shí)候桃子一共有多少個(gè)呢?
輸入:
輸入數(shù)據(jù)有多組,每組占一行,包含一個(gè)正整數(shù)n(1<n<30),表示只剩下一個(gè)桃子的時(shí)候是在第n天發(fā)生的。輸出:
輸入數(shù)據(jù)有多組,每組占一行,包含一個(gè)正整數(shù)n(1<n<30),表示只剩下一個(gè)桃子的時(shí)候是在第n天發(fā)生的。樣例輸入:
2 4樣例輸出:
4 22
題目鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=2013
迭代的方法很簡(jiǎn)單,直接按題目意思來(lái)就可以了。
<span style="font-size:18px;">for (s = n = 1; n &lt; 30; n++)s = (s + 1) * 2;</span>
<span style="font-size:18px;"><br /></span>
<span style="font-size:18px;"><br /></span>
計(jì)算機(jī)的鼻祖本來(lái)就是數(shù)學(xué)家,自然優(yōu)化程序的最終方法還是要回歸到數(shù)學(xué)上。
本題很容易得到它的遞推方程:
f(1) = 1;f(n) = [f(n-1) + 1] × 2;
于是我們得到:
f(n) + 2 = 2 × [f(n-1) + 2] f(1) + 2 = 3=>f(n) + 2 = 3 × 2n-1=>f(n) = 3 × 2n-1 - 2
對(duì)于這種推斷題還有另外一種遞推方法,雖然對(duì)于本題來(lái)說(shuō)很麻煩。但有時(shí)候它是無(wú)可替代的。
f(1) = 1; f(n) = 2f(n-1) + 2 = f(n-1) + 2f(n-2) + 4;=>f(n) + f(n-1) + 4 = 2 × [f(n-1) + f(n+2) + 4];設(shè) g(n) = f(n) + f(n-1) + 4;則 g(n) = 2 × g(n-1);g(2) = f(2) + f(1) + 4 = 9;∴g(n) = 9 × 2n-2 (n > 1)∴f(n) + f(n-1) = 9 × 2n-2 - 4 ①f(n-1) + f(n-2) = 9 × 2n-3 - 4 ②┋f(3) + f(2) = 9 × 2 - 4f(2) + f(1) = 9 - 4把①式減去②式得f(n) = 9 × 2n-3 + f(n-2)f(n-2) = 9 × 2n-5 + f(n-4)┋
這時(shí)候,我們需要分類(lèi)討論了:
f(n) = 9 × 2n-3 + f(n-2)f(n-2) = 9 × 2n-5 + f(n-4)┋f(5) = 9 × 22 + f(3)f(3) = 9 + f(1)f(1) = 1從下往上迭代,得:f(n) = 9 × (2n-3 + 2n-5 + ... + 22 + 1) + 1 =>f(n) = 9 × (1 - 4(n-1)/2) ÷ (1 - 4) + 1 =>f(n) = 3 × 2n - 1 - 2
f(n) = 9 × 2n-3 + f(n-2)f(n-2) = 9 × 2n-5 + f(n-4)┋f(4) = 9 × 21 + f(2)f(2) = 4從下往上迭代,得:f(n) = 9 × (2n-3 + 2n-5 + ... + 21) + 4 =>f(n) = 9 × 2 × (1 - 4(n-2)/2) ÷ (1 - 4) + 4 =>f(n) = 3 × 2n - 1 - 2
世上的事往往如此,巧合的事情經(jīng)常發(fā)生。不得不感嘆大自然的美妙~
現(xiàn)在我們就得到了這道題目的公式了: f(n) = 3 × 2n – 1?– 2
| 01 | #include <math.h> |
| 02 | #include <stdio.h> |
| 03 | ? |
| 04 | int?main(void) |
| 05 | { |
| 06 | ????int?n; |
| 07 | ? |
| 08 | ????while?(scanf("%d", &n) != EOF) |
| 09 | ????????printf("%.0f\n", 3 *?pow(2, n - 1) - 2); |
| 10 | ? |
| 11 | ????return?0; |
| 12 | } |
《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專(zhuān)家共同創(chuàng)作,文字、視頻、音頻交互閱讀
總結(jié)
以上是生活随笔為你收集整理的hdu 2013 蟠桃记-递推-[解题报告]C++的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: ACM训练赛--递推专题
- 下一篇: ACM输入输出--多组测试用例--C、C