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 }

 

posted @ 2017-01-29 10:23  Kayden_Cheung  阅读(585)  评论(0编辑  收藏  举报
//目录