您的位置:首页 > 编程语言

编程挑战之罐子和硬币思路

2014-01-27 17:36 253 查看
该题目看似简单,实际也挺简单,但是容易造成麻痹大意,本人就在这儿栽了,下面列出分析过程,避免朋友在同一个地方跌倒,同志们请从我跌倒的岔路口飘过。。。

题目描述如下:

罐子和硬币有n个罐子,有k个硬币,每个罐子可以容纳任意数量的硬币。罐子是不透明的,起初你可以随机把这k个硬币任意放在罐子里。然后罐子被打乱顺序,你从外表无法区别罐子。最后罐子被编上号1-n。你有p次机会,每次你可以选择某个罐子,如果该罐子里有硬币,则你可以得到1个(你不可以知道该罐子里有多少硬币),如果该罐子是空的,你得不到任何硬币。你最终要得到至少c枚硬币,我们的问题是给定n,k,c,求出最少的p,存在一种你最初放硬币的方式,无论罐子如何被打乱顺序,你都能p次机会内获得至少c个硬币。
输入n,k,c (0 < n <=1000000, 0 < c <= k <=1000000)。 输出,最小的p值。 例如n = 3, k = 6, c = 4。 你可以把每个罐子放入两个硬币,这样得到4次机会可以得到4个硬币,输出4

题目分析:

1.由于题目中给出的实例是把硬币平均放入n个罐子中,因此最初自己没有做多的设想,以为这是个很简单的问题,直接依葫芦画瓢,想的是把k枚硬币平均放入n个罐子中,设每个罐子中至少放入的硬币数位nv=k/n 个,余下来的那部分md = k%v个,从n个罐子中随机选择md个,每个放入1个,择n个罐子中有md个放入nv+1个,其余有nv个

假设cv = c/n, cmd = c%n这样可能会有以下情况

(1)cv<nv时,只要轮流从所有罐子循环取硬币,即可在c次取出c枚硬币;

(2)cv=nv时,当每个罐子中都取出nv个之后,有nul = n-md个罐子是空的,考虑最坏的情况,取出nv*n枚硬币之后,连续nul次,选择的罐子都是空的,这时候需要的次数P=c+nul次。

当时觉得问题真简单,编码之后,提交,被温柔的给了个提示,您无法通过这个实例哦。。。亲。。。

了解了吗,上述分析是有问题的,那么问题在哪儿呢?

2.按照 1 中分析的方法,nul是固定的,但是这中取钱币的方法真的是最有效的么,当然不是!!! 那就说明nul是一个可变量,如果nul可变,怎么能把它变得更小呢?怎样才能把取空的可能性降到最低呢,考虑一下把空的位置从横向平铺转为纵向,即某些罐子是空的,另外有某个罐子中有较少的硬币,其他的罐子有同样多的钱币。

(1)假设空罐子为nul2个,钱币较少的罐子中有md个钱币,有同样多钱币的罐子为n-nul2-1 or n-nul2个,取决于md是否为0.

(2)这样问题就转化为对nul2+1 or nul2 的优化,具体代码就先不列出了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息