问题: (帖子路径:http://topic.csdn.net/u/20091027/09/db4cd117-bfbe-491f-bcb8-d54ee08c0787.html)
求一个高效算法:
有100名小朋友,
现在有一堆礼物
若是礼物数量小于100,比如为81,则这个81份礼物随机分配给小朋友,但要确保是一个人只能拿到一份礼物;
若是礼物数量大于100,
比如为115,则每个人至少有一份礼物,部分人有两份礼物,但没人拿到两份份以上的礼物;
比如为245,则每个人至少有两份礼物,部分人有三份礼物,但没人拿到三分份以上的礼物;
就是这个思路,这里声明不是大学老师布置的题目啊,是自己工作中一个抽象出来的问题,
希望得到大家的思路,,参与者,高分重谢!
也是个大家交流的机会
这个帖子让我感慨,我们csdn论坛中卧虎藏龙,真的很佩服,
本次系列一,把主要的解决思想整理一下
地址:http://blog.csdn.net/yinyuan1987/archive/2009/10/30/4748636.aspx
系列二,把大家使用不同的解决方法或实例提出来共享一下
地址:http://blog.csdn.net/yinyuan1987/archive/2009/10/30/4748671.aspx
系列三,把大家对性能方面思路提出来共享一下
地址:http://blog.csdn.net/yinyuan1987/archive/2009/10/30/4748715.aspx
一. 第一种解决方法
上面我说的4楼堕落佛兄回答如下
第一个问题 直接随机吧,先 int[] a = new int[100]; 0--> a, 然后取81个随机数(100以内的),比如取了一个数n ,则
t = n ;
while(a[t] !=0)
{ t = nextRandam();}
a[t] = 1;
冲突必然是有的,就看怎么解决了,
感觉有点类似于 构建 hash表
其实最终问题就第一个,因为第二个第三个都可以在循环之后变成第一个问题
二. 上面是一般会思考到的方法,也有朋友说可以使用以下方法:
8楼djt_1982朋友说:
把小朋友顺序打乱,然后循环好了。被排在前面的先拿,后面的后拿。
17楼alifriend朋友说:
如果对随机性要求不是很高,可以把小朋友随机排序打乱,然后将前N名分一个礼物即可,这样可以不必再去检查这个小朋友是否已经分到礼物,省去“已分到礼物,则重新承机”这个步骤
8楼朋友补充:
这个思路才是正确的,不会导致随机性不高,只要打乱顺序的算法好一点就可以了。简单的就是循环一边,然后每个都生成一个0~99的随机位置,然后两个位置上的小朋友交换一下位置。一边下来就是随机顺序了
这个我想没有谁对谁错的,只是思路不同,大家可以参考一下,当然还有很多朋友的回答,小弟这里只罗列出这几个朋友的回答。