A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 孤鸢 中级黑马   /  2014-8-31 20:08  /  1775 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

新人向各位大侠问好!第一次看到买可乐问题是一哥们分享入学考试最后一题,想着先给毕老师视频看完再做题试试,然而这两天貌似这话题出现频率挺高,然后好奇心下还是决定解解看。
废话不多说。最开始看到题的思路:先买三瓶,换一瓶,将增量,瓶盖数和实际瓶数分开计数,{在循环内,{判断满三个瓶盖,瓶盖置一,瓶盖多加一},增量,瓶盖和实际瓶数保持递增,瓶盖数达到人头数则退出循环},返回实际瓶数。这算是伪代码么 0.0。

然后在本论坛找了找最近几天关于可乐的帖子,看到可以借瓶盖的思想,立马觉得我之前的思想局限了,因为此时也回想起之前看过“农夫分家产”的问题:有一农夫家有3个儿子,17只羊,要求老大分1/2,老二分1/3,老三分1/9,不能给羊杀了,还要把羊都分出去,该怎么分?这个问题的思路就是先从村里借一头羊,按规则分完后,还剩一只羊再还给被借羊的主人。
那么回到买可乐的问题,买两瓶可以从可乐公司借一个瓶盖,意味着买2瓶够3人喝,那么只要人是3的倍数,就只需买2/3人的瓶就够全部人喝,不能被3整除,剩下的人就必须每人一瓶,这时候就不用从可乐公司借瓶盖了,直接从余下的人中匀一个出来。
代码实现
  1. class GetBottle
  2. {
  3.         //可乐瓶数
  4.         private int colaBottle = 0;
  5.         //人数
  6.         int people;

  7.         //构造函数
  8.         GetBottle(int people)
  9.         {
  10.                 this.people = people;
  11.         }

  12.         //买可乐方法
  13.         public int BuyCola()
  14.         {
  15.                 colaBottle = (people/3)*2 + people%3;
  16.                 return colaBottle;
  17.         }
  18. }
  19. class TestDemo
  20. {
  21.         public static void main(String[] args)
  22.         {
  23.                 GetBottle gb = new GetBottle(28);
  24.                 int bott = gb.BuyCola();

  25.                 System.out.println(gb.people+" 人需要买 "+bott+" 瓶可乐,可以保证全人喝到");
  26.         }
  27. }
复制代码
好嘛,这时候乌龙来了,代码实现了之后,忍不住度娘看看,是不是有一样的解法的哥们呢?一查发现,原来这是小学奥数题……顿时心里面那点小激动烟消云散了。这时候,我又有种错觉,没有循环的程序看着怎么都不像“高端”的程序,然而就事论事,这个问题,如果思想明了,一个简单公式能搞定的,肯定要比循环效率高。
然后,再给思维发散下:某公司需给员工提供矿泉水,现矿泉水公司有一活动,喝完8桶可以换1桶水,该公司一个月需求300桶水(假设公司能储水1个月不变质),怎么样购买公司更经济?是不是一样可以用上面的思想?我觉得可以,不过没论证,觉得行不通的欢迎指点。

7 个回复

倒序浏览
支持!。。。
回复 使用道具 举报
赊账的思路我总觉得不靠谱,这等于是人为改变了题目条件。如果可以借1个瓶盖,为什么不能借2个、3个?
回复 使用道具 举报
fantacyleo 发表于 2014-8-31 21:22
赊账的思路我总觉得不靠谱,这等于是人为改变了题目条件。如果可以借1个瓶盖,为什么不能借2个、3个? ...

如果借的能一个不差的还回去,感觉能接受,就这题情况借多了还真不一定都能还回去
回复 使用道具 举报
顶一个。。。
回复 使用道具 举报
孤鸢 发表于 2014-8-31 21:25
如果借的能一个不差的还回去,感觉能接受,就这题情况借多了还真不一定都能还回去 ...

赊的那瓶本来就是商家的啊,那不叫还,叫空手套白狼。如果是面试,跟面试官交流一下未尝不可。这里上交的测试题一般都是机器直接判卷,跟预设答案不符就直接错了。当然,也许标答就是可以赊账也未可知;P
回复 使用道具 举报
masai158 来自手机 高级黑马 2014-8-31 22:24:33
7#
fantacyleo 发表于 2014-8-31 21:22
赊账的思路我总觉得不靠谱,这等于是人为改变了题目条件。如果可以借1个瓶盖,为什么不能借2个、3个? ...

借2个,借3个,你还能还吗!!!花最少的钱够多少钱!!这是我对提意的理解
回复 使用道具 举报
masai158 发表于 2014-8-31 22:24
借2个,借3个,你还能还吗!!!花最少的钱够多少钱!!这是我对提意的理解 ...

既然花最少的钱,那么还不还又有什么关系呢?可见还是要有规矩的,所谓3个瓶盖换1瓶,当然指的是用买来的3瓶可乐的瓶盖去换,我觉得这应该是基本共识,在这上面抠字眼,属于钻牛角尖。再说,你只借1个瓶盖也还不上。一个瓶盖必定对应着一瓶可乐,可谁来为这瓶可乐买单呢?你只还了瓶盖,那么可乐的单只能是别人来买了。于是,所谓的“还”,不过是慷他人之慨。当然,我们这里怎么说都没用,对与不对,判卷的程序最清楚
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马