Codeforces Gym J题贪心解法调试求助:7数不等式验证问题
问题根源分析:贪心解法无法通过测试用例的核心原因
1. 完全误解题目核心条件
题目要求的是原数组的下标满足 i₁ ≥ i₂ ≥ i₃ ≥ i₄ ≥ i₅ ≥ i₆ ≥ i₇,而非元素值的非递增。你的代码一开始就对数组进行降序排序,彻底破坏了原数组的下标顺序,导致选出的元素对应的原数组下标大概率不满足非递增要求,同时也会错过原数组中符合下标条件的有效组合。
比如测试用例 [3,3,1,1,1,1,1]:
- 原数组中存在有效组合:下标6≥5≥4≥3≥2≥1≥0,对应元素值1,1,1,1,1,3,3,满足
1 < 1+1且1+1 <1+1+3+3,总sum为11。 - 你的代码排序后数组为
[3,3,1,1,1,1,1],遍历后会返回-1,完全错过该有效组合。
2. sum_x4_x7的选择逻辑错误
即使忽略下标条件的误解,你的代码在选择x4-x7时,固定取x3后面连续的四个元素,而非排除x1,x2,x3后的最大四个元素。在降序数组中,若x2,x3选择了靠后的小元素,前面未被选中的大元素才是x4-x7的最优选择,你的代码会错过这种情况,导致无法满足sum_x2_x3 < sum_x4_x7的条件,或者得到的总sum不是最大值。
3. 循环内的数值更新错误
在x3的循环中,你递增x3后没有重新计算sum_x2_x3,而是沿用之前的数值,导致后续的sum_x2_x3 >= nums[x1]判断完全失效,会错误地跳过或进入不符合条件的分支。
修正思路
- 回归题目下标要求:必须基于原数组的下标非递增规则选择元素,即所选元素在原数组中的位置是从右往左(或相同位置,需保证下标唯一)的顺序。
- 预处理后缀最大和数组:为了高效计算某位置左侧的最大元素组合,预处理三个后缀数组:
max1[i]:从下标0到i的最大元素值;max2[i]:从下标0到i的最大两个元素的和;max4[i]:从下标0到i的最大四个元素的和。
- 遍历所有可能的i3位置:对于每个i3(作为第三个元素的下标),在i3到N-1的范围内找满足
x[i1] < x[i2]+x[i3]的最大x[i1]+x[i2]+x[i3],同时在0到i3-1的范围内找最大的四个元素和,判断是否满足x[i2]+x[i3] < max4[i3-1],记录所有符合条件的组合的最大总sum。 - 控制时间复杂度:通过预处理数组将每次查询的时间降到O(1),整体时间复杂度保持在O(N),适配N≤5e5的规模。
内容的提问来源于stack exchange,提问作者Shukie
相关产品推荐
相关产品推荐

