Add, Divide and Floor

我们不妨将这个式子看做取中点,然后就会发现每次操作不改变相对大小,然后看这篇洛谷题解

解释一下他这个合理性,主要是害怕讨论每次操作后的 a , b a,b a,b的奇偶而已

这里其实官方题解给出了一个提示

我们设最开始的 b − a = x b-a=x ba=x,那么根据这篇洛谷题解,而每次操作要么让 x = ⌊ x 2 ⌋ x=\lfloor \frac{x}{2} \rfloor x=2x,要么让 x = ⌈ x 2 ⌉ x=\lceil \frac{x}{2} \rceil x=2x,最终要让 x = 0 x=0 x=0。这就只跟 x x x有关了,显然我们每次要让 x x x向下取整是最快的

  • 9
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
public static void main(String[] args) { //初始化测试场景 BigDecimal[][] rrr = { {new BigDecimal("0.1"), new BigDecimal("10")}, {new BigDecimal("1"), new BigDecimal("10")}, {new BigDecimal("100"), new BigDecimal("10")}, {new BigDecimal("1000"), new BigDecimal("10")} }; BigDecimal min = new BigDecimal("0.01"); //测试个场景 for (BigDecimal[] decimals : rrr) { final BigDecimal amount = decimals[0]; final BigDecimal num = decimals[1]; System.out.println(amount + "元" + num + "个人抢======================================================="); test3(amount, min, num); } } private static void test3(BigDecimal amount,BigDecimal min ,BigDecimal num){ final Random random = new Random(); final int[] rand = new int[num.intValue()]; BigDecimal sum1 = BigDecimal.ZERO; BigDecimal redpeck ; int sum = 0; //num总人数 for (int i = 0; i < num.intValue(); i++) { rand[i] = random.nextInt(100); sum += rand[i]; } final BigDecimal bigDecimal = new BigDecimal(sum); BigDecimal remain = amount.subtract(min.multiply(num)); for (int i = 0; i < rand.length; i++) { if(i == num.intValue() -1){ redpeck = remain; }else{ redpeck = remain.multiply(new BigDecimal(rand[i])).divide(bigDecimal,2, RoundingMode.FLOOR); } if(remain.compareTo(redpeck) > 0){ remain = remain.subtract(redpeck); }else{ remain = BigDecimal.ZERO; } sum1= sum1.add(min.add(redpeck)); System.out.println("第"+(i+1)+"个人抢到红包金额为:"+min.add(redpeck)); } System.out.println("校验每个红包累计额度是否等于红包总额结果:"+(amount.compareTo(sum1)==0)); } }解释这段代码
07-14

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值