解题思路:
注意事项:
参考代码:
n, k = map(int, input().split()) nums = [int(i) for i in input().split()] nums.sort(reverse=True) ans = 0 i = 0 limit = n - 1 while i < limit - 2: l = i + 1 r = i + 2 while l < limit : while r < limit : if (nums[i] + nums[l] + nums[r]) % k == 0: ans = max(ans, nums[i] + nums[l] + nums[r]) limit = r l += 1 r = l + 1 else: r += 1 l += 1 r = l + 1 i += 1 # limit = n - 1 删掉这一行就能过,但我也不知道为什么,不删就只能到82 print(ans)
0.0分
4 人评分
Wu-求圆的面积 (C++代码)浏览:1883 |
蛇行矩阵 (C语言代码)浏览:524 |
Hello, world! (C语言代码)浏览:822 |
钟神赛车 (C语言代码)浏览:590 |
图形输出 (C语言代码)浏览:937 |
C语言程序设计教程(第三版)课后习题8.1 (C语言代码)浏览:563 |
C语言程序设计教程(第三版)课后习题1.5 (C语言代码)浏览:539 |
多组数据新方法浏览:355 |
C语言程序设计教程(第三版)课后习题6.2 (C语言代码)浏览:566 |
计算表达式浏览:642 |
菜菜ccEL 2022-03-24 22:23:02 |
为什么要limit=r啊?
Hello 2022-03-27 20:06:52 |
因为列表nums[]里的数字是从大到小排列的,当找到一组i,l,r满足(nums[i] + nums[l] + nums[r]) % k == 0时,因为题目要求的是这三个数之和最大,之后满足(nums[i] + nums[l] + nums[r]) % k == 0的一组i,l,r必不可能大于等于上一组的r,否则一定不会比上一组的(nums[i] + nums[l] + nums[r])大。