You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Codechef RECIPE题提交WA,样例通过却报错,请求排查原因

解决Codechef RECIPE题目的Wrong Answer问题

嘿,我来帮你捋捋这个问题!你说提交代码后拿到了WA,但示例用例能跑对,这确实挺让人挠头的。咱们先拆解下你的代码逻辑哪里出了问题:

你的思路是先检查有没有0(这点没问题,食材数量肯定是正整数),然后拿列表里的最小元素去判断每个数能不能被它整除,如果全都能就除以最小数,否则输出原数组。但这个逻辑的核心错误在于:题目要求我们把每个数除以它们的最大公约数(GCD),而不是除以最小元素

举几个反例就能直观明白问题所在:

  • 比如测试用例输入:1 3 4 6 8
    你的代码里最小元素是4,6%4=2≠0,所以会输出原数组4 6 8,但正确结果应该是2 3 4——因为这三个数的GCD是2,每个数除以2之后就没法再约分了。
  • 再比如输入:1 4 6 9 12
    最小元素是6,9%6=3≠0,你的代码输出原数组,但正确结果是2 3 4(GCD是3)。

为什么会这样?因为最小元素不一定是所有数的公约数,而我们需要的是能整除所有数的最大那个数(也就是GCD),用它来约分才能得到题目要求的“最简比例”。

那怎么修正代码呢?我们需要计算所有元素的GCD,然后每个元素除以这个GCD就行。这里要注意,Python的math.gcd只能处理两个数,所以我们可以用functools.reduce来批量计算列表的GCD。

修正后的代码如下:

import math
from functools import reduce

def get_gcd(arr):
    return reduce(math.gcd, arr)

for _ in range(int(input())):
    _, *items = map(int, input().split())
    gcd_val = get_gcd(items)
    print(*[x // gcd_val for x in items])

咱们来验证一下刚才的反例:

  • 对于4 6 8,GCD是2,每个数除以2得到2 3 4,符合要求。
  • 对于6 9 12,GCD是3,除以3得到2 3 4,正确。

另外,你原来代码里的if (0 not in items)其实可以去掉,因为题目里的食材数量都是正整数,不会出现0的情况。

这样修改后,应该就能通过所有测试用例啦!

内容的提问来源于stack exchange,提问作者faisal ameen

火山引擎 最新活动