UVa 12627 奇怪的气球膨胀(分治)
Posted 谦谦君子,陌上其华
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UVa 12627 奇怪的气球膨胀(分治)相关的知识,希望对你有一定的参考价值。
https://vjudge.net/problem/UVA-12627
题意:一开始有一个红气球。每小时后,一个红气球会变成3个红气球和1个蓝气球,而1个蓝气球会变成4个蓝气球。如图所示分别是经过0,1,2,3,小时后得情况。经过k小时后,第A~B行一共有多少个红气球。
思路:由图分析,每次把图分为四个部分,右下角的部分全为蓝气球,不用去管他,剩下三部分都是一样的并且和前一小时的图形是一样的,这样的话我们可以计算出每个时刻红气球的总数。
既然每次可以分为四部分,那么很明显的就是用分治法来解决。分别计算出B行之前和A-1行之前的红气球总数,那么A~B行的气球总数就是两者相减。
1 #include<iostream> 2 using namespace std; 3 4 long long ans[35]; 5 6 long long f(int k,int i) 7 { 8 if (i==0) return 0; 9 if (k==0) return 1; 10 if (i < 1 << (k - 1)) return 2 * f(k - 1, i); 11 else return f(k - 1, i - (1 << (k - 1))) + 2 * ans[k - 1]; 12 } 13 14 int main() 15 { 16 //freopen("D:\\\\txt.txt", "r", stdin); 17 int n; 18 cin >> n; 19 int k, a, b, kase=0; 20 ans[0] = 1; 21 for (int i = 1; i < 30; i++) 22 { 23 ans[i] = 3 * ans[i - 1]; 24 } 25 for (int i = 0; i < n; i++) 26 { 27 cin >> k >> a >> b; 28 long long num = f(k, b) - f(k, a - 1); 29 cout << "Case " << ++kase << ": " << num << endl; 30 } 31 return 0; 32 }
以上是关于UVa 12627 奇怪的气球膨胀(分治)的主要内容,如果未能解决你的问题,请参考以下文章
UVa12627 Erratic Expansion (分治)
8-12 Erratic Expansion uva12627
Uva 12627 Erratic Expansion(递归)