解题思路:
注意事项:
参考代码:
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 人评分
C语言训练-计算1~N之间所有奇数之和 (C语言代码)浏览:689 |
C语言训练-计算t=1+1/2+1/3+...+1/n (C语言代码)浏览:909 |
【绝对值排序】 (C语言代码)浏览:832 |
这可能是一个假的冒泡法浏览:1071 |
上车人数 (C语言代码)浏览:816 |
C语言程序设计教程(第三版)课后习题3.7 (C语言代码)浏览:268 |
C语言程序设计教程(第三版)课后习题3.7 (C语言代码)浏览:729 |
IP判断 (C语言代码)浏览:592 |
C语言程序设计教程(第三版)课后习题3.7 (C语言代码)浏览:545 |
C语言程序设计教程(第三版)课后习题11.5 (C语言代码)浏览:1029 |
菜菜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])大。