题目描述

我们把玻璃杯摆成金字塔的形状,其中第一层有1个玻璃杯,第二层有2个,依次类推到第100层,每个玻璃杯(250ml)将盛有香槟。

从顶层的第一个玻璃杯开始倾倒一些香槟,当顶层的杯子满了,任何溢出的香槟都会立刻等流量的流向左右两侧的玻璃杯。当左右两边的杯子也满了,就会等流量的流向它们左右两边的杯子,依次类推。(当最底层的玻璃杯满了,香槟会流到地板上)

例如,在倾倒一杯香槟后,最顶层的玻璃杯满了。倾倒了两杯香槟后,第二层的两个玻璃杯各自盛放一半的香槟。在倒三杯香槟后,第二层的香槟满了 - 此时总共有三个满的玻璃杯。在倒第四杯后,第三层中间的玻璃杯盛放了一半的香槟,他两边的玻璃杯各自盛放了四分之一的香槟,如下图所示。

示例 1:
输入: poured(倾倒香槟总杯数) = 1, query_glass(杯子的位置数) = 1, query_row(行数) = 1
输出: 0.0
解释: 我们在顶层(下标是(0,0))倒了一杯香槟后,没有溢出,因此所有在顶层以下的玻璃杯都是空的。

示例 2:
输入: poured(倾倒香槟总杯数) = 2, query_glass(杯子的位置数) = 1, query_row(行数) = 1
输出: 0.5
解释: 我们在顶层(下标是(0,0)倒了两杯香槟后,有一杯量的香槟将从顶层溢出,位于(1,0)的玻璃杯和(1,1)的玻璃杯平分了这一杯香槟,所以每个玻璃杯有一半的香槟。

注意:

poured 的范围[0, 10 ^ 9]。
query_glass 和query_row 的范围 [0, 99]。

解题思路

假设倒入20杯酒,每个杯子停留的酒数量有:

第0层:
a[0][0] = 20

第一层:
a[1][0] = (a[0][0] - 1) / 2 = 4.5
a[1][1] = (a[0][0] - 1) / 2 = 4.5

第二层:
a[2][0] = (a[1][0]-1) / 2
a[2][1] = (a[1][0]-1) / 2 + (a[1][1]-1) / 2
a[2][2] = (a[1][1]-1) / 2

第三层:
a[3][0] = (a[2][0]-1)/2
a[3][1] = (a[2][0]-1)/2 + (a[2][1]-1)/2
a[3][2] = (a[2][1]-1)/2 + (a[2][2]-1)/2
a[3][3] = (a[2][2]-1)/2

第四层:
a[4][0] = (a[3][0]-1)/2
a[4][1] = (a[3][0]-1)/2 + (a[3][1]-1)/2
a[4][2] = (a[3][1]-1)/2 + (a[3][2]-1)/2
a[4][3] = (a[3][2]-1)/2 + (a[3][3]-1)/2
a[4][3] = (a[3][3]-1)/2

第N层:
a[N][0] = (a[N-1][0] - 1)/2
a[N][1] = (a[N-1][0] - 1)/2 + (a[N-1][1] - 1)/2
a[N][N] = (a[N-1][N-1] - 1) /2

通过上面,可以推导出第query_row层,query_glass位置的酒杯中酒的分量为:
a[query_row][query_glass] = (a[query_row - 1][query_glass-1] - 1) /2 + (a[query_row - 1][query_glass] - 1) /2

ps:这是假设计算过程中不存在负数的情况 ,实际程序中需要考虑负数场景。

程序实现

public static double champagneTower(int poured, int query_row, int query_glass) {double[][] arr = new double[query_row + 2][query_row+2];arr[0][0] = poured;for(int i=0;i<query_row;i++){for(int j=0;j<=i;j++){//当前行多余的酒往下分.double remain = (arr[i][j] - 1) / 2;if(remain > 0){arr[i+1][j] += remain;arr[i+1][j+1]+= remain;}}}return arr[query_row][query_glass] >1.0 ? 1.0 : arr[query_row][query_glass];}

一天一道算法题——799. 香槟塔相关推荐

  1. 【LeetCode每日一题:799.香槟塔~~~模拟】

    题目描述 我们把玻璃杯摆成金字塔的形状,其中 第一层 有 1 个玻璃杯, 第二层 有 2 个,依次类推到第 100 层,每个玻璃杯 (250ml) 将盛有香槟. 从顶层的第一个玻璃杯开始倾倒一些香槟, ...

  2. 799. 香槟塔 : 简单线性 DP 运用题

    题目描述 这是 LeetCode 上的 799. 香槟塔 ,难度为 中等. Tag : 「动态规划」.「线性 DP」 我们把玻璃杯摆成金字塔的形状,其中 第一层 有 1 个玻璃杯, 第二层 有 2 个 ...

  3. 一天一道算法题--5.30---递归

    感谢微信平台:  一天一道算法题 --------每天多一点进步--------- 今天 休假 这题 也很水 能发现 规律就好 明天 再也不能这样了 forgive me ---------- 转载于 ...

  4. 一天一道算法题--6.15--卡特兰数

    感谢微信平台---一天一道算法题---每天多一点进步- problem: 12个高矮不同的人 排成两排 每排必须是从矮到高排列 而且第二行比对应的第一排的人高 问排列方式有多少种? analyse: ...

  5. 一道算法题跟大家分享

    无意中看到一道算法题,拿出我的解法与大家分享. 题目:输出1,2,3,4四个数字能组成的互不相同且无重复的三位数并统计满足条件的三位数个数 大家先想想,再看答案吧. View Code 1 /// & ...

  6. 每天一道算法题系列十七之电话号码的字母组合

    每天一道算法题系列: 来源:力扣(LeetCode) 本题链接:https://leetcode-cn.com/problems/letter-combinations-of-a-phone-numb ...

  7. 搜狗2020秋招笔试的一道算法题

    搜狗2020秋招的一道算法题 有A,B,C三种样品,凑齐三个样品各一个就可以领取一个奖品.任意两个样品可兑换另一种样品,如AA可兑换一个B或一个C,AB可兑换一个C.输入ABC,问最多可以领取多少奖品 ...

  8. 每天一道算法题系列十二之整数转罗马数字

    每天一道算法题系列: 来源:力扣(LeetCode) 本题链接:https://leetcode-cn.com/problems/integer-to-roman/ 来源是力扣,大家喜欢可以去力扣中文 ...

  9. Java实现 LeetCode 799 香槟塔 (暴力模拟)

    799. 香槟塔 我们把玻璃杯摆成金字塔的形状,其中第一层有1个玻璃杯,第二层有2个,依次类推到第100层,每个玻璃杯(250ml)将盛有香槟. 从顶层的第一个玻璃杯开始倾倒一些香槟,当顶层的杯子满了 ...

最新文章

  1. 使用Python在Selenium WebDriver中获取WebElement的HTML源代码
  2. module._init_() takes at most 2 arguments (3 given) (scrapy tutorial w/ xpath)
  3. log4j.xml 简介
  4. 【解决方案】vue不是内部或外部命令
  5. ECCV 2018 | Bi-box行人检测:‘行人遮挡’为几何?
  6. 加速度积分成位移的频域方法
  7. Django model反向关联名称的方法(转)
  8. MAC itunes无法验证服务器s.mzstatic/itunes无法更新服务器解决方案
  9. 防止网页后退--禁止缓存
  10. c语言如何将一个二维数组全为零_从零开始如何用python处理数据
  11. 完全二叉树之深度问题
  12. 学习Spring必学的Java基础知识(2)----动态代理
  13. C++代码示例2 ~ 求立方体的面积和体积并求出两个立方体是否相等
  14. [精简]托福核心词汇78
  15. 亚马逊利润_大流行给亚马逊带来了创纪录的利润
  16. AES256加解密与异常处理
  17. 倍福TwinCAT3导入TwinCAT2项目的方法
  18. Idea一键导入所有缺省的包
  19. C/C++中#和##的宏以及进行“花里胡哨“的命名及其应用
  20. 苹果玩对峙2显示打不开服务器,苹果对峙2为什么进不去

热门文章

  1. 百度网盘网页视频在线倍速播放
  2. 监控宝———开启智能监控新时代
  3. Word 2013中给一行加阴影的操作方法
  4. 基于单片机智能远程可控交通信号灯系统设计
  5. 政法委社会治安防控平台建设,重点人员联防联控系统开发
  6. WACV 2020 | ULSAM: 超轻量级子空间注意力机制(keras实现)
  7. 一道数量遗传学题:如何计算育种值
  8. 双侧检验的p值和单侧检验_单侧检验和双侧检验单侧检验和双侧检验.ppt
  9. 什么是知网的跨库检索?为什么我的文章在知网检索不到了?
  10. Windows ❀ 网络认证