【求一高效算法,感兴趣的朋友可以来试试,高分】解决方案整理系列一

问题: (帖子路径: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

其实最终问题就第一个,因为第二个第三个都可以在循环之后变成第一个问题

. 上面是一般会思考到的方法,也有朋友说可以使用以下方法:

8djt_1982朋友说:

把小朋友顺序打乱,然后循环好了。被排在前面的先拿,后面的后拿。

17alifriend朋友说:

如果对随机性要求不是很高,可以把小朋友随机排序打乱,然后将前N名分一个礼物即可,这样可以不必再去检查这个小朋友是否已经分到礼物,省去已分到礼物,则重新承机这个步骤

8楼朋友补充:

这个思路才是正确的,不会导致随机性不高,只要打乱顺序的算法好一点就可以了。简单的就是循环一边,然后每个都生成一个0~99的随机位置,然后两个位置上的小朋友交换一下位置。一边下来就是随机顺序了

这个我想没有谁对谁错的,只是思路不同,大家可以参考一下,当然还有很多朋友的回答,小弟这里只罗列出这几个朋友的回答。

你可能感兴趣的:(解决方案)