贪心、最小乘积

这篇博客探讨了如何使用贪心策略解决寻找两个数的最小乘积问题,其中每次操作可以交换两个数的任意二进制位。由于操作不影响两数之和,问题转化为在固定和的情况下找到最小乘积。关键在于理解当两个数相等时乘积最大,因此目标是尽可能让所有数接近。在有奇数和偶数个数的情况下,通过特定的匹配策略,可以确保至少有一个数变为1,从而达到最小乘积。在实际计算中,需要注意防止整数溢出,并正确处理取模运算的时机。
摘要由CSDN通过智能技术生成

LINK

给定一个p,表示有(2^p) - 1个数:[1, 2, 3, ..., (2^p - 1)]
每次操作: 选择两个x和y,交换他俩的某一个二进制位。 操作可以进行无数次。
问这些数的 最小的 >0的 乘积。
在这里插入图片描述

我们交换x和y 的某一个二进制位,肯定是: 一个是1,一个是0.
对于交换二进制位这一操作,他不会影响 (x + y)的和!!
因为,一个数 += (1<<k),另一个数 -= (1 << k)

这一性质,非常非常重要!!!

首先我们将问题简化,先不看这n个数,而是先看2个数(因为,每次swap,是找两个数)

对于两个数x, y 来说,我们如何操作 可以使x * y最小呢??
因为操作不影响两数的和,所以问题转换为: sum = x + y,sum为定值,问x * y的最小值

这其实是一个常识,当x和y的差距 为0,即x = y = sum / 2时,x * y最大。
在这里插入图片描述
因为x + y = sum,所以,x和y 一定关于sum / 2对称。 当他俩的距离越远,从上图可以看出,z值变小。即x * y的值 变小。


在本题中,不管怎么变,任何一个数 都必须 > 0
即在已知x + y = sum的前提下

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值