问题描述:一位酒商共有5桶葡萄酒和1桶啤酒,6个桶的容量分别为30升、32升、36升、38升、40升和62升,
并且只卖整桶酒,不零卖。第一位顾客买走了2整桶葡萄酒,第二位顾客买走的葡萄酒是第一位顾客的2倍。那么,本来有多少升啤酒呢?解析:由于该酒商只卖整桶酒,简单分析几个桶的容量可知,第二位顾客必须买走剩下的3桶葡萄酒才有可能是第一位顾客的2倍。假设第一位顾客买走的葡萄酒共L升,那么第二位顾客买走的是2L升。也就是说,葡萄酒的总数应该能被3整除。所以,解法就呼之欲出了。Python 解法1
1 buckets = {30,32,36,38,40,62}2 total = sum(buckets)3 for item in buckets:4 if (total-item) % 3 == 0:5 print(item)6 break
虽然这样也能简单的解决问题,但是再考虑多一点,注意题目“只卖整桶”这个限制条件,更加规范的解法如下(但似乎没什么必要)
解法2
1 buckets = {30,32,36,38,40,62} 2 def solve(buckets): 3 total = sum(buckets) 4 for item in buckets: 5 div,mod = divmod((total-item),3) 6 if mod == 0: 7 for i in buckets: 8 j = div - i 9 if j!=i and (j in buckets):10 return (item,(i,j))11 return 'no answer'12 13 print(solve(buckets))
代码中第8行 因为第一个顾客买的是2桶酒之和,所以验证是否存在这2桶酒,假如不存在即返回no answer。
Java 实现(java底子比较浅,写起来代码很难看,如果有更好的写法希望能赐教一下)
1 public static int bear(){ 2 int buckets[] = {30,32,36,38,40,62}; 3 int sum = 0; 4 for(int bs :buckets){ 5 sum += bs; 6 } 7 for(int i=0;i<6;i++){ 8 int rest = sum-buckets[i]; 9 int mod = rest % 3;10 if(mod == 0) {11 int div = rest / 3;12 for(int j=0;j<6;j++){13 int sep = div - buckets[j];14 if(sep != buckets[j] && InBuckets(sep,buckets)){15 return buckets[i];16 }17 }18 }19 }20 return 0;21 }22 23 public static boolean InBuckets(int x,int[] buckets){24 for(int i=0;i
参考资料 微信号 Python_xiaowu