开发者社区> 问答> 正文

遇到一个数组变换的问题,求解答。

如果给出一个长度为n的数组,和一个正整数d。每次可以选择其中任意一个元素 a[i]将其变为a[i] +d或a[i]-d,这算作一次操作。需要将所有的元素全部变成相等元素,如果有解,请输出最小操作次数,如果无解则输出 -1。输入数字 n、数字 d,和一个长度为 n 的数组 a。1<=n<=1000001<=d<=100,1<=a[i]<=100000。输出一个数字,表示最小的操作次数,如果无解输出 -1。

展开
收起
游客4skzfvnrxrzbi 2021-12-23 15:39:02 481 0
1 条回答
写回答
取消 提交回答
  • 首先判断无解的情况,可以发现a[i],a[i]+d, a[i]-d在模d情况下的余数不会发生改变,因此如果原数组中的存在任意两个数字它们对 d 取余结果不同,那么此时无解。 设余数为 r。判断完无解之后,需要求出最小值。 先将数组 a[i] 排序,然后除以 d,得到从 r 变成 a[i] 需要的步数。 枚举元素 a[i],将所有元素全部变成 a[i] 需要考虑两部分,i 之前和 i 之后 :对于 i 之前的元素,假设都是 r,那么需要 (i-1)*a[i],但是因为并不都是 0,所有我们可以用一个变量 val 存放前 i-1 项的和,然后我们在减去 val 就是前 i-1 个元素真正需要操作的步数。 对于i之后的元素,也是类似的。我们假设i之后的所有项和为val,假设我们要将它们变为r,则消耗即为val,但是我们只需要将其变为a[i],因此需要减去(n-i)*a[i]。 因此输入:5,2,[3,5,7,1,9] 输出:6。 注意:最优解为全部变为 5,共 1+ 0+1 +2+2=6 次。

    2021-12-23 18:13:48
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载