You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

帕斯卡三角叠杯加水问题:输入K单位水求水量最少的r行c号杯

帕斯卡三角倒水问题解法修正

原代码核心疏漏

  • 索引逻辑混乱:Python原生列表为0索引,原代码混用1索引访问列表,存在越界风险,也导致边界位置的水量计算错误。
  • 溢出传递逻辑错误:未对上层杯子做容量截断(超过1的部分才是溢出量,上层杯子最终最多保留1单位水),且d1、d2变量未在每次计算前重置,会携带上一轮计算的错误值。
  • 倒水循环逻辑冗余:不需要逐单位倒水模拟,直接将全部K单位水倒入顶层后逐层传递溢出即可,计算效率更高。
  • 边界处理错误:边缘位置的杯子只承接上一层对应边缘杯子的溢出量,只有上层杯子溢出时才有水流入,原代码直接赋值为上层水量/2,未判断上层是否溢出。

正确实现思路

  1. 统一使用0索引存储水杯矩阵,最终输出时转换为用户需要的1-based行号、列号。
  2. 初始化足够大的二维数组存储每个杯子的水量,将全部K单位水直接倒入顶层杯子g[0][0]。
  3. 从上到下逐层处理溢出:
    • 遍历当前行每个杯子,若水量超过1,计算溢出量,将当前杯子水量截断为1
    • 把溢出量平均分成两份,分别流入下一层相邻的两个杯子
  4. 遍历所有杯子,过滤掉水量为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 09:27:01