新人向各位大侠问好!第一次看到买可乐问题是一哥们分享入学考试最后一题,想着先给毕老师视频看完再做题试试,然而这两天貌似这话题出现频率挺高,然后好奇心下还是决定解解看。
废话不多说。最开始看到题的思路:先买三瓶,换一瓶,将增量,瓶盖数和实际瓶数分开计数,{在循环内,{判断满三个瓶盖,瓶盖置一,瓶盖多加一},增量,瓶盖和实际瓶数保持递增,瓶盖数达到人头数则退出循环},返回实际瓶数。这算是伪代码么 0.0。
然后在本论坛找了找最近几天关于可乐的帖子,看到可以借瓶盖的思想,立马觉得我之前的思想局限了,因为此时也回想起之前看过“农夫分家产”的问题:有一农夫家有3个儿子,17只羊,要求老大分1/2,老二分1/3,老三分1/9,不能给羊杀了,还要把羊都分出去,该怎么分?这个问题的思路就是先从村里借一头羊,按规则分完后,还剩一只羊再还给被借羊的主人。
那么回到买可乐的问题,买两瓶可以从可乐公司借一个瓶盖,意味着买2瓶够3人喝,那么只要人是3的倍数,就只需买2/3人的瓶就够全部人喝,不能被3整除,剩下的人就必须每人一瓶,这时候就不用从可乐公司借瓶盖了,直接从余下的人中匀一个出来。
代码实现
- class GetBottle
- {
- //可乐瓶数
- private int colaBottle = 0;
- //人数
- int people;
- //构造函数
- GetBottle(int people)
- {
- this.people = people;
- }
- //买可乐方法
- public int BuyCola()
- {
- colaBottle = (people/3)*2 + people%3;
- return colaBottle;
- }
- }
- class TestDemo
- {
- public static void main(String[] args)
- {
- GetBottle gb = new GetBottle(28);
- int bott = gb.BuyCola();
- System.out.println(gb.people+" 人需要买 "+bott+" 瓶可乐,可以保证全人喝到");
- }
- }
复制代码 好嘛,这时候乌龙来了,代码实现了之后,忍不住度娘看看,是不是有一样的解法的哥们呢?一查发现,原来这是小学奥数题……顿时心里面那点小激动烟消云散了。这时候,我又有种错觉,没有循环的程序看着怎么都不像“高端”的程序,然而就事论事,这个问题,如果思想明了,一个简单公式能搞定的,肯定要比循环效率高。
然后,再给思维发散下:某公司需给员工提供矿泉水,现矿泉水公司有一活动,喝完8桶可以换1桶水,该公司一个月需求300桶水(假设公司能储水1个月不变质),怎么样购买公司更经济?是不是一样可以用上面的思想?我觉得可以,不过没论证,觉得行不通的欢迎指点。
|
|