【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原理总结
269 0
|
3月前
|
机器学习/深度学习 存储 算法
回声状态网络(Echo State Networks,ESN)详细原理讲解及Python代码实现
本文详细介绍了回声状态网络(Echo State Networks, ESN)的基本概念、优点、缺点、储层计算范式,并提供了ESN的Python代码实现,包括不考虑和考虑超参数的两种ESN实现方式,以及使用ESN进行时间序列预测的示例。
150 4
回声状态网络(Echo State Networks,ESN)详细原理讲解及Python代码实现
|
6月前
|
算法 搜索推荐 Java
图计算中的PageRank算法是什么?请解释其作用和计算原理。
图计算中的PageRank算法是什么?请解释其作用和计算原理。
78 0
|
网络架构 索引
ST-GCN代码解读
ST-GCN代码解读
234 0
CF763A Timofey and a tree(思维)
CF763A Timofey and a tree(思维)
77 0
python SMAP_level2c nc 文件做线性拟合:y=ax+b
最近再处理卫星盐度数据时,通过时空匹配以及质量控制之后,需要对所得数据进行拟合分析。进而分析其误差分布、原因等。 根据学习,python中自带线性拟合的函数,使用起来较为方便快捷~
python SMAP_level2c nc 文件做线性拟合:y=ax+b
|
Python
Julia:如何用 Plots 画多个子图
Plots 可以画出很多丰富的图。从画线、点、阴影填充都可以,但是在 Julia 上面,与 Python 上的 Matplotlib 的写法有很大的不同,这篇文章就是写一些基本的或者常用的用法,包括如何用 For 循环去画多个子图。
174 0
Julia:如何用 Plots 画多个子图
|
人工智能
CF1556D. Take a Guess(交互 性质)
CF1556D. Take a Guess(交互 性质)
89 0
CF1556D. Take a Guess(交互 性质)
CF1341C. Nastya and Strange Generator(思维 模拟 构造)
CF1341C. Nastya and Strange Generator(思维 模拟 构造)
83 0
|
Windows
CF1343E. Weights Distributing(最短路 枚举 思维)
CF1343E. Weights Distributing(最短路 枚举 思维)
82 0