帕斯卡三角叠杯加水问题:输入K单位水求水量最少的r行c号杯
帕斯卡三角倒水问题解法修正
原代码核心疏漏
- 索引逻辑混乱:Python原生列表为0索引,原代码混用1索引访问列表,存在越界风险,也导致边界位置的水量计算错误。
- 溢出传递逻辑错误:未对上层杯子做容量截断(超过1的部分才是溢出量,上层杯子最终最多保留1单位水),且d1、d2变量未在每次计算前重置,会携带上一轮计算的错误值。
- 倒水循环逻辑冗余:不需要逐单位倒水模拟,直接将全部K单位水倒入顶层后逐层传递溢出即可,计算效率更高。
- 边界处理错误:边缘位置的杯子只承接上一层对应边缘杯子的溢出量,只有上层杯子溢出时才有水流入,原代码直接赋值为上层水量/2,未判断上层是否溢出。
正确实现思路
- 统一使用0索引存储水杯矩阵,最终输出时转换为用户需要的1-based行号、列号。
- 初始化足够大的二维数组存储每个杯子的水量,将全部K单位水直接倒入顶层杯子
g[0][0]。 - 从上到下逐层处理溢出:
- 遍历当前行每个杯子,若水量超过1,计算溢出量,将当前杯子水量截断为1
- 把溢出量平均分成两份,分别流入下一层相邻的两个杯子
- 遍历所有杯子,过滤掉水量为0的空杯,找到水量最小的杯子,输出对应的1-based行、列号(若存在多个最小值,默认返回行号最小、同行列号最小的结果)。
修正后参考代码
def find_min_water_cup(K): # 最多预设20行,足够应对K<=1000的场景 max_row = 20 g = [[0.0]*(i+1) for i in range(max_row)] g[0][0] = K for i in range(max_row-1): for j in range(i+1): if g[i][j] > 1: overflow = g[i][j] - 1 g[i][j] = 1.0 # 溢出量平分到下一层两个相邻杯子 g[i+1][j] += overflow / 2 g[i+1][j+1] += overflow / 2 # 寻找盛水量最少的非空杯子 min_val = float('inf') res_r, res_c = 0, 0 for i in range(max_row): for j in range(i+1): if 0 < g[i][j] < min_val: min_val = g[i][j] res_r, res_c = i+1, j+1 # 转成1-based索引 return res_r, res_c # 调用示例 K = int(input()) r, c = find_min_water_cup(K) print(r, c)
验证说明
比如输入K=2时,顶层杯子满,溢出1单位平分到第二层两个杯子各0.5,此时最小水量是0.5,输出第2行第1号,若需要优先返回同层靠右的结果,调整遍历顺序即可。
内容的提问来源于stack exchange,提问作者user16657590
相关产品推荐
相关产品推荐

