UVA - 12627 Erratic Expansion : 遞歸

題目點此跳轉

思路

 題目意思是(書上原話)一開始有一個紅氣球。每小時後,一個紅氣球會變成3個紅氣球和一個藍氣球,一個藍氣球會變成4個藍氣球,如圖所示分別是經過0, 1, 2, 3小時後的情況。經過k小時後,第A~B行一共有多少個紅氣球?例如,k=3,A=3,B=7,答案爲14。

這裏寫圖片描述

需要設出如下變量:

g(k, i): k 小時後最下面 i 行的紅氣球總數
c(k): k 小時後紅氣球的總數

則對於輸入的k, a, b, 顯然結果爲

g(k, 2ka+1 ) - g(k, 2k - b)
//即k時從第a行到最後一行的紅氣球數 - 從第b+1行到最後一行的紅氣球數

那麼只要知道如下遞推關係即可解決本題:

g(k, i) = 2 * g(k-1, i-2k1 ) + c(k), {i>=2k1 }
g(k, i) = g(k-1, i ), {i<2k1 }
c(k) = 3k

代碼

LL k, a, b, c[maxn];

LL g(LL k, LL i) {
    if(i == 0) return 0;
    if(k == 0) return 1;
    LL t = 1<<(k-1);
    if(i >= t) return 2*g(k-1, i-t) + c[k-1];
    return g(k-1, i);

}

int main() {

    c[0] = 1;
    for(int i = 1; i <= 30; ++i) c[i] = 3*c[i-1];
    int kase = 0, t; cin >> t;
    while(t--) {
        scanf("%lld%lld%lld", &k, &a, &b);
        LL n = 1<<k;
        printf("Case %d: %lld\n", ++kase, g(k, n-a+1)-g(k, n-b));

    }
    return 0;
}
發佈了115 篇原創文章 · 獲贊 27 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章