力扣之吃葡萄问题

题目大意如下:现在有三堆葡萄a,b,c。现在规定三个人来吃这些葡萄,第一个人只能吃a,b两堆,第二个人只能吃b,c两堆,第三个人只能吃c,a两堆。问你三人中吃得最多的人它最少吃多少个葡萄?

分析:
三个人,三堆葡萄,如果没有任何限制,那指定是三人均分,此时吃得最多的人它吃到的葡萄肯定是最少的。这种情况应该好理解,因为你想让吃最多葡萄的人吃的数量最小,那你进行平均分配后,吃最多的人也就是比其它人多吃1个,这种情况下,它吃的葡萄会比其它情况下的都少。

但是现在又加了一个限制条件,每个人只能吃设定的两堆,那么此时,这种情况就和三角形很类似,三个顶点就是三个人,三条边就是三堆葡萄,边长就是葡萄数量。每个人只能吃两类葡萄,即每个顶点只和两条边相邻。想到的这些,再加上我们最开始分析的最好可以均分能满足题意的情况,我们就可以做出如下分析:

1、如果三堆的数量满足两小堆之和大于大堆的话,即a+b < c;这种情况下,我们是可以满足题意的情况下均分的,即在满足每个人只能吃两堆的要求下均分。因为两小堆的和是大于另一堆的,因此我们在三条边上找到三个点,这三个点将其三角形周长均分,在一条边上必不可能出现两个点,也就是每条边一个点。。。这句话希望大家好好理解,因此当前情况下是可以满足一个人只吃两堆葡萄的前提下平分的。

2、如果三堆的数量满足两小堆之和的2倍小于大堆的话,那么两小堆之和是小于总周长的三分之一,也就是此时就算一个人把两小堆全给吃了,也不会出现均分,因为两小堆不足三分之一。那么此时什么情况下会导致吃的最多的人吃的数量最少呢?那就让一个人把两小堆全吃了,剩下的均分大堆。

3、如果三堆数量满足两小堆之和小于大堆,但是2倍的两小堆之和大于大堆,那么此时两小堆之和应该是周长的三分之一和二分之一之间。此时也是可以均分的。因为此时均分三边周长,任意一边长不会出现两点。

综上,便分析出了结果,代码如下:

int Test(int[] nums){
    
    Array.sort(nums);
    int a = nums[0];
    int b = nums[1];
    int c = nums[2];
    // 情况一
    if(a + b > c){
        // 要求吃得最多的人吃的数量,那么肯定是向上取整,因此+2
        return (a + b + c + 2) / 3;
    }
    if(2*(a+b) < c){
        // 不能均分,此时让一个人把两小堆全吃了,剩下两人均分最大堆
        return (c + 1) / 2;
    }
    
    // 剩下的情况,都不满足最长边大于等于周长的2/3.只有当最长边满足大于等于2/3倍周长时,均分才会导致一条边出现两个均分点,从而和题目要求的每个人只能吃两堆冲突
    return (a + b + c + 2) / 3;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值