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




