您的位置:首页 > 其它

Uva12627 Erratic Expansion【分治】【例题8-12】

2017-03-01 00:41 393 查看
题目:Erratic Expansion

题意:一开始有一个红气球。 每小时后,一个红气球会变成3个红气球和一个蓝气球,而一个蓝气球会变成4个蓝气球,经过k小时后,第A~B行一共有多少个红气球? 

思路:自己没有做出,参考紫书的,直接解析紫书分析。

设g(k,i)表示k小时之后最下面i行的红气球总数
,则答案为g(k,(1<<k) - a +1) - g(k,(1<<k) - b);



解释下这递归式是怎么来的!

当i >= 2^(k-1) 时 g(k,i)=2g(k-1,i-2^(k-1))+c(k-1)



由上图可得,k小时后最下面i行的红气球总数 = k-1小时的2个那一小部分 + k-1小时的总红气球,因为上一次的总框架是下一次的1/4!

参考:紫书-例8-12-P

代码:#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
typedef long long LL;
LL c(int k){
LL ans = 1;
for(int i=0;i<k;i++) ans *= 3;
return ans;
}
/*long long c(int i) {return i == 0 ? 1 : c(i-1)*3;}*/
LL g(int k,LL i){
if(i == 0) return 0;
if(k == 0) return 1;
if(i >= 1<<(k-1) ) return 2*g(k-1,i - (1<<(k-1))) + c(k-1);
else return g(k-1,i);
}
int main()
{
int t,k,a,b,kcase = 0;
scanf("%d",&t);
while(t--){
scanf("%d%d%d",&k,&a,&b);
printf("Case %d: %lld\n",++kcase,g(k,(1<<k) - a +1) - g(k,(1<<k) - b));
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  acm uva 解题报告