题目大意如下:现在有三堆葡萄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;
}