这道题大体意思是利用一种递归规则生成不同的气球,问在某两行之间有多少个红气球。

我拿到这个题,一开始想的是递归求解,但在如何递归求解的思路上我的方法是错误的。在研读了例题上给出的提示后豁然开朗(顺便吐槽一下算法竞赛第二版在这这道题目上(P246)提示写的有问题,g(k,i)=2g(k-1,i-2^(k-1))+c(k-1)  ,他把c(k-1)写成了c(k)...我纠结这个纠结了好久)

根据题目提示,这道题可以用f(k,i)表示k小时后最上边i行的红气球总数

那么我们的答案就可以表示为f(k,b)-f(k,a-1)

如何求f(k,i)?

这里我们通过观察,在k小时后所分成的四部分气球中,最右下角区域的气球是跟其他区域气球不相同的。因此我们可以分成两种情况(i在上半部分和i在下半部分)。

当i<2^(k-1),f(k,i)=2*f(k-1,i)

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

其中c(k-1)代表完整的那部分的红气球数,也就是k-1小时后的红气球数。

由气球构造方式可得递推式:c(k)=3c(k-1),c(0)=1,可知这是个等比数列,求得c(k)=3^k

至此我们就可以得到我们想要的答案了。

第一次,时间超限:

#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
long f(long k,long h)
{if(k==0&&h==1) return 1;if(h<=0) return 0;long m=pow(2,k-1);if(h>m) return 2*f(k-1,m)+f(k-1,h-m);else return 2*f(k-1,h);
}
int main()
{int T,i,q=1;cin>>T;while(T--){long k,A,B,sum=0;cin>>k>>A>>B;printf("Case %d: ",q++);cout<<f(k,B)-f(k,A-1)<<"\n";}return 0;
}

第二次,根据书本改了下,加了个c函数,对了

#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
long c(long k)
{long sum=1;while(k--){sum*=3;}return sum;
}
long f(long k,long h)
{if(k==0&&h==1) return 1;if(h<=0) return 0;long m=pow(2,k-1);if(h>m) return 2*c(k-1)+f(k-1,h-m);else return 2*f(k-1,h);
}
int main()
{int T,i,q=1;cin>>T;while(T--){long k,A,B,sum=0;cin>>k>>A>>B;printf("Case %d: ",q++);cout<<f(k,B)-f(k,A-1)<<"\n";}return 0;
}

Uva 12627 Erratic Expansion相关推荐

  1. Uva 12627 Erratic Expansion(不稳定膨胀)

    题目链接 : Erratic Expansion 大致题意: 开始时有一个红气球,每过一段时间,气球会膨胀, 一个红气球膨胀成三个红气球,一个蓝气球膨胀成四个蓝气球(如图) 题目输入正整数n表示n组数 ...

  2. UVa 12627 Erratic Expansion - 分治

    因为不好复制题目,就出给出链接吧: Vjudge传送门[here] UVa传送门[here] 请仔细看原题上的那幅图,你会发现,在时间t(t > 0),当前的气球构成的一幅图,它是由三个时间为( ...

  3. UVa 12627 - Erratic Expansion

    链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

  4. uva 12627——Erratic Expansion

    题意:一开始有1个红气球,每小时一个红气球都会变成3个红气球和1个蓝气球,1个蓝气球会变成4个蓝气球,问k个小时后a行到b行的红气球的数量. 思路:递推.a为偶数时,计算a+1到b以及a本行的红气球数 ...

  5. UVA 12627 Erratic Expansion

    题目大致意思为 告诉你一个红球为0时状态,已知一个红球每过一个时间会变为文档所示图中的3红1蓝,而蓝球每过一个时间则会变为4个蓝球.问在某一时刻,h1与h2之间的红球有几个. RT,这一题刚看到的时候 ...

  6. UVA - 12627 Erratic Expansion : 递归

    题目点此跳转 思路  题目意思是(书上原话)一开始有一个红气球.每小时后,一个红气球会变成3个红气球和一个蓝气球,一个蓝气球会变成4个蓝气球,如图所示分别是经过0, 1, 2, 3小时后的情况.经过k ...

  7. Uva - 12627 - Erratic Expansion

    找到递推公式,题目就引刃而解了.数学公式博文没办法写,就写在了word上,切过来了: 用 f 或者 g 都能求出,我两个方法都试了,结果用 g 要比 f 快了近一倍,原本以为 f 会快些,可能是因为往 ...

  8. UVA - 12627 - Erratic Expansion(找规律递归)

    递归找规律即可,用前b行减去前a-1行的红气球个数求解,细节见代码 #include<cstdio> #include<cstring> #include<cstdlib ...

  9. uva 12627 Erratic Expansion

    原题: Piotr found a magical box in heaven. Its magic power is that if you place any red balloon inside ...

最新文章

  1. 「Django」rest_framework学习系列-用户认证
  2. Oracle Events事件
  3. [Luogu 3258] JLOI2014 松鼠的新家
  4. pdf在浏览器的显示问题
  5. C#基础-应用程序域
  6. Android开发:《Gradle Recipes for Android》阅读笔记1.3
  7. c# TCP高性能通信
  8. java数据库表不存在_如果Java生产代码中不存在并在JUnit中确认,则创建数据库表...
  9. Python GIL 系列之再谈Python的GIL
  10. bzoj 1227 [SDOI2009]虔诚的墓主人
  11. js获取el表达式的值_Vue.js
  12. pdo mysql 绑定查询_php mysql PDO 查询操作的实例详解
  13. “约女生图书馆一起自习”总结
  14. Java Bubble Sort 冒泡排序图解
  15. matlab几何形状面积计算,小学数学几何图形计算公式总结
  16. 13 函数列与函数项级数
  17. 李少白讲摄影-不放过一切光线 地坛书市新书首发圆满结束
  18. 电大形考作业c语言答案,题目精编国家开放大学电大《管理信息系统》形考网络课作业1-4试题及答案...
  19. 解决打印机“正在删除、正在打印”没反应问题
  20. Jetpack 系列之AppSearch

热门文章

  1. 机械臂操作运动传送带上的物体
  2. java psyounggen_Java 虚拟机
  3. java 工具类命名_排名前16的Java工具类
  4. 简单的弹窗应用(二)--AlertDialog
  5. 如何为几乎所有电话添加无线充电
  6. 同步传输和异步传输的区别
  7. A Transformer-based Approach for Source code Summarization 翻译
  8. 基于OHCI的USB主机 —— UFI命令监视代码
  9. 解决浏览器兼容新问题
  10. SAP CTRL加逗号,句号后注释和取消注释不起作用的解决方法