如果给出一个长度为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。
首先判断无解的情况,可以发现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 次。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。