【CF 676B Pyramid of Glasses】模拟,递归

简介: 题目链接:http://codeforces.com/problemset/problem/676/B 题意:一个n层的平面酒杯金字塔,如图,每个杯子的容量相同。现在往最顶部的一个杯子倒 t 杯酒,求流动结束后有多少个杯子被装满。

题目链接:http://codeforces.com/problemset/problem/676/B

题意:一个n层的平面酒杯金字塔,如图,每个杯子的容量相同。现在往最顶部的一个杯子倒 t 杯酒,求流动结束后有多少个杯子被装满。

思路:每个局部的两代三个杯子的流动过程是一致的,因此可以用递归来模拟求解。

具体为:设add(cur, i, l)执行“往第 i 个杯子倒cur量的酒”,附加信息: i 位于第 l 层。若执行完剩余了surplus量的酒,则往 i 的下一层左右两侧的杯子各倒surplus/2量的酒;若无剩余,则抵达递归基。

关于 i 与它下一层的对应关系:我对所有杯子从1开始逐层从左到右编号,因此 i 的左下为i+l, 右下为i+l+1。

关于surplus的值:按照CF的题解的做法,如果有n层,则把每个杯子的容量记为volume = 2 ^ n份,这样能保证即使到第n层每次的cur也都整数。

维护数组v, 其中v[i] 记录当前第 i 个杯子中已有的酒量,若有剩余,则surplus = cur - (volume - v[i])。

最后统计下所有n*(n+1)/2个杯子中v[i]==volume的个数即可。

 1 #include <cstdio>
 2 #include <cmath>
 3 using namespace std;
 4 const int MAX_N = 10;
 5 
 6 int t, n;
 7 int num;
 8 int v[MAX_N*(MAX_N+1)/2 + 1];
 9 int volume;
10 int cnt;
11 
12 void add(int cur, int i, int l){
13     if(l > n) return ;
14     if(cur + v[i] <= volume){//最多加满当前的,不会溢出 
15         v[i] += cur;
16         return ;
17     }
18     int surplus = cur - (volume - v[i]);//有溢出 
19     v[i] = volume;
20     add(surplus/2, i+l, l+1);
21     add(surplus/2, i+l+1, l+1);
22 }
23 
24 int main()
25 {
26     scanf("%d%d", &n, &t);
27     num = n*(n+1)/2;
28     volume = pow(2, n);
29     int cur = volume * t;
30     cnt = 0;
31     add(cur, 1, 1);
32      for(int i=1; i<=num; i++){
33          //printf("%d %d\n", i, v[i]);
34          if(v[i] == volume) cnt++;
35      }
36     printf("%d\n", cnt);
37     return 0;
38 }

 

目录
相关文章
|
机器学习/深度学习 算法 网络架构
ST-GCN原理总结
ST-GCN原理总结
295 0
|
6月前
|
存储 算法 数据挖掘
python5种算法模拟螺旋、分层填充、递归、迭代、分治实现螺旋矩阵ll【力扣题59】
python5种算法模拟螺旋、分层填充、递归、迭代、分治实现螺旋矩阵ll【力扣题59】
|
7月前
|
算法 搜索推荐 Java
图计算中的图剪枝算法是什么?请解释其作用和常用方法。
图计算中的图剪枝算法是什么?请解释其作用和常用方法。
54 0
|
算法 数据挖掘 知识图谱
LINE算法复现 图表示学习 基于line 算法的节点分类 聚类显示 完整代码+数据
LINE算法复现 图表示学习 基于line 算法的节点分类 聚类显示 完整代码+数据
57 0
|
机器学习/深度学习 人工智能
CF1496A Split it!(数学分析)
CF1496A Split it!(数学分析)
48 0
|
机器学习/深度学习
CF1000C Covered Points Count(拆分思想,分成2种类型)
CF1000C Covered Points Count(拆分思想,分成2种类型)
63 0
|
网络架构 索引
ST-GCN代码解读
ST-GCN代码解读
253 0
|
算法 计算机视觉
3D检测经典 | 第一个Anchor-Free、第一个NMS-Free 3D目标检测算法!!!(二)
3D检测经典 | 第一个Anchor-Free、第一个NMS-Free 3D目标检测算法!!!(二)
105 0
|
机器学习/深度学习 自动驾驶 算法
3D检测经典 | 第一个Anchor-Free、第一个NMS-Free 3D目标检测算法!!!(一)
3D检测经典 | 第一个Anchor-Free、第一个NMS-Free 3D目标检测算法!!!(一)
224 0
|
JavaScript 前端开发 API
for 循环不是目的,map 映射更有意义!【FP探究】
在 JavaScript 中,由于 Function 本质也是对象(这与 Haskell 中【函数的本质是值】思路一致),所以我们可以把 Function 作为参数来进行传递!