[题解]UVA12627 奇怪的气球膨胀 Erratic Expansion
思路
这题是一道非常好的递归分治题。
首先我们需要读懂题目。题目说: 小时内, 红可以变成 红 + 蓝, 蓝可以变成 蓝,问:第 小时, 行中有几个红。
然后,我们可以预处理一下第 个小时,总共的红气球的数量,即 个。
其次,我们定义一个 函数,表示第 小时, 红球的总数。
我们来看一下 函数是怎么实现这个功能的。
这个函数的边界有两个:
- 时,返回 。
- 时,返回 。
这两点想必大家都没有问题。
最重要的地方来了,我们可以将函数分为两种情况。
- 如果 在上半部分,即:,就要返回 。
- 否则,就要返回 。
最后,输出的时候用一个类似于前缀和的思路即可。
Code
#include <bits/stdc++.h>
#define int long long
using namespace std;
int T,opt,k,a,b;
int r[35];
int f(int k,int x){// f 函数
if (x <= 0) return 0;//两个边界
if (k == 0) return 1;
if (x <= 1 << k - 1) return f(k - 1,x) * 2;//两种情况
return f(k - 1,x - (1 << k - 1)) + 2 * r[k - 1];
}
signed main(){
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
r[0] = 1;//预处理
for (int i = 1;i <= 30;i++) r[i] = r[i - 1] * 3;
cin >> T;
while (T--){
cin >> k >> a >> b;//输入
cout << "Case " << ++opt << ": " << f(k,b) - f(k,a - 1) << endl;//输出
}
return 0;
}
作者:WaterSun
出处:https://www.cnblogs.com/WaterSun/p/18270909
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
分类:
题解
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】