文章
187
粉丝
0
获赞
3
访问
56.4k

评分及理由
(1)得分及理由(满分4分)
得分:2分
理由:学生的基本设计思想是:先遍历数组找到全局最大值max和最小值min,然后根据A[i]的正负分别乘以max或min。但这一思路存在逻辑错误。题目要求对于每个A[i],需要计算A[i]与A[j](i≤j≤n-1)乘积的最大值,即只考虑i及其右侧的元素。学生的做法使用了整个数组的全局最大值和最小值,当最大值或最小值出现在A[i]左侧时,会导致结果错误。例如,对于A[]={1,4,-9,6},按照学生的算法,max=6,min=-9,计算res[0]=1*6=6(正确),但res[1]=4*6=24(正确),res[2]=(-9)*(-9)=81(错误,因为-9右侧的最小值是6,乘积应为-54,但题目示例给的是81,这里示例本身有误?实际上对于A[2]=-9,右侧元素只有6,乘积为-54,但示例给81,说明示例中可能考虑了i=j的情况?仔细看题目:0≤i≤j≤n-1,即j可以等于i,所以对于A[2]=-9,j可以取2,乘积为81,这是正确的。但学生的算法用全局min=-9,A[2]*min=81,巧合正确。但考虑另一个例子:A=[-1, 5, -2],按题目要求:res[0]应为max(-1*-1, -1*5, -1*-2)=1,res[1]=max(5*5,5*-2)=25,res[2]=(-2*-2)=4。学生算法:max=5, min=-2,则res[0]=(-1)*(-2)=2(错误,应为1),res[1]=5*5=25(正确),res[2]=(-2)*(-2)=4(正确)。可见学生的算法在最大值或最小值出现在左侧时会导致错误。因此,设计思想有缺陷,扣2分。
(2)得分及理由(满分7分)
得分:3分
理由:代码实现了学生的设计思想,但存在逻辑错误,具体同上。代码中max和min的初始值设为-1和1也不合理,如果数组所有元素都小于-1或大于1,则初始值会影响结果。应使用数组中的某个元素初始化或使用INT_MAX/INT_MIN。此外,代码没有处理A[i]等于0的情况(虽然题目未明确,但按逻辑A[i]=0时乘积最大为0,但学生的代码在A[i]>0时乘max,否则乘min,若A[i]=0,会执行else分支乘min,可能得到负数,错误)。由于逻辑错误和初始值问题,扣4分。代码结构清晰,给3分。
(...
登录后发布评论
暂无评论,来抢沙发