Uva 12627 Erratic Expansion
这道题大体意思是利用一种递归规则生成不同的气球,问在某两行之间有多少个红气球。
我拿到这个题,一开始想的是递归求解,但在如何递归求解的思路上我的方法是错误的。在研读了例题上给出的提示后豁然开朗(顺便吐槽一下算法竞赛第二版在这这道题目上(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相关推荐
- Uva 12627 Erratic Expansion(不稳定膨胀)
题目链接 : Erratic Expansion 大致题意: 开始时有一个红气球,每过一段时间,气球会膨胀, 一个红气球膨胀成三个红气球,一个蓝气球膨胀成四个蓝气球(如图) 题目输入正整数n表示n组数 ...
- UVa 12627 Erratic Expansion - 分治
因为不好复制题目,就出给出链接吧: Vjudge传送门[here] UVa传送门[here] 请仔细看原题上的那幅图,你会发现,在时间t(t > 0),当前的气球构成的一幅图,它是由三个时间为( ...
- UVa 12627 - Erratic Expansion
链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
- uva 12627——Erratic Expansion
题意:一开始有1个红气球,每小时一个红气球都会变成3个红气球和1个蓝气球,1个蓝气球会变成4个蓝气球,问k个小时后a行到b行的红气球的数量. 思路:递推.a为偶数时,计算a+1到b以及a本行的红气球数 ...
- UVA 12627 Erratic Expansion
题目大致意思为 告诉你一个红球为0时状态,已知一个红球每过一个时间会变为文档所示图中的3红1蓝,而蓝球每过一个时间则会变为4个蓝球.问在某一时刻,h1与h2之间的红球有几个. RT,这一题刚看到的时候 ...
- UVA - 12627 Erratic Expansion : 递归
题目点此跳转 思路 题目意思是(书上原话)一开始有一个红气球.每小时后,一个红气球会变成3个红气球和一个蓝气球,一个蓝气球会变成4个蓝气球,如图所示分别是经过0, 1, 2, 3小时后的情况.经过k ...
- Uva - 12627 - Erratic Expansion
找到递推公式,题目就引刃而解了.数学公式博文没办法写,就写在了word上,切过来了: 用 f 或者 g 都能求出,我两个方法都试了,结果用 g 要比 f 快了近一倍,原本以为 f 会快些,可能是因为往 ...
- UVA - 12627 - Erratic Expansion(找规律递归)
递归找规律即可,用前b行减去前a-1行的红气球个数求解,细节见代码 #include<cstdio> #include<cstring> #include<cstdlib ...
- uva 12627 Erratic Expansion
原题: Piotr found a magical box in heaven. Its magic power is that if you place any red balloon inside ...
最新文章
- 「Django」rest_framework学习系列-用户认证
- Oracle Events事件
- [Luogu 3258] JLOI2014 松鼠的新家
- pdf在浏览器的显示问题
- C#基础-应用程序域
- Android开发:《Gradle Recipes for Android》阅读笔记1.3
- c# TCP高性能通信
- java数据库表不存在_如果Java生产代码中不存在并在JUnit中确认,则创建数据库表...
- Python GIL 系列之再谈Python的GIL
- bzoj 1227 [SDOI2009]虔诚的墓主人
- js获取el表达式的值_Vue.js
- pdo mysql 绑定查询_php mysql PDO 查询操作的实例详解
- “约女生图书馆一起自习”总结
- Java Bubble Sort 冒泡排序图解
- matlab几何形状面积计算,小学数学几何图形计算公式总结
- 13 函数列与函数项级数
- 李少白讲摄影-不放过一切光线 地坛书市新书首发圆满结束
- 电大形考作业c语言答案,题目精编国家开放大学电大《管理信息系统》形考网络课作业1-4试题及答案...
- 解决打印机“正在删除、正在打印”没反应问题
- Jetpack 系列之AppSearch