【求一高效算法,感兴趣的朋友可以来试试,高分】

抬头望远,低头沉思 2009-10-27 09:23:55
加精
问题:
求一个高效算法:
有100名小朋友,
现在有一堆礼物
若是礼物数量小于100,比如为81,则这个81份礼物随机分配给小朋友,但要确保是一个人只能拿到一份礼物;

若是礼物数量大于100,
比如为115,则每个人至少有一份礼物,部分人有两份礼物,但没人拿到两份份以上的礼物;
比如为245,则每个人至少有两份礼物,部分人有三份礼物,但没人拿到三分份以上的礼物;

就是这个思路,这里声明不是大学老师布置的题目啊,是自己工作中一个抽象出来的问题,

希望得到大家的思路,,参与者,高分重谢!

也是个大家交流的机会

我的思路和4楼堕落佛兄的思考方法一样, 也是大家考虑的循环思路
但是这样的弊端是,在人数和礼品数比较少时可以,就像我上面举得数字,
可以若是几万,几十万,这种解决方法的效率就会越来越差
...全文
5594 278 打赏 收藏 转发到动态 举报
写回复
用AI写文章
278 条回复
切换为时间正序
请发表友善的回复…
发表回复
cgstrikezyl 2009-11-19
  • 打赏
  • 举报
回复
我的思路和4楼堕落佛兄的思考方法一样, 也是大家考虑的循环思路
但是这样的弊端是,在人数和礼品数比较少时可以,就像我上面举得数字,
可以若是几万,几十万,这种解决方法的效率就会越来越差

size=礼物数/100 先循环每个人给size这么多. 后面处理多出来的不到100的.效率要高出100倍吧。
langdy 2009-11-07
  • 打赏
  • 举报
回复
循环两次搞定,第一次循环(礼物数/100)分给小朋友,第二次(礼物数%100)依次分给小朋友;注意:第一次取整,第二次求余
sunjia5451937 2009-11-07
  • 打赏
  • 举报
回复
小于100的就不说了,如果大于100,则用礼物数除以100,取余数,将余数随即分配,每人限分一个,再与整数相加,不就行了。时间复杂度为1.空间复杂度不计,比用什么循环强吧。
lichong_87 2009-11-07
  • 打赏
  • 举报
回复
路过。学习了~~
  • 打赏
  • 举报
回复
假如100个小朋友分20个
考虑公平的话
小朋友先随机排序再分配
第一个小朋友获得的几率是20/100 如果第一个小朋友获得了 第二个小朋友获得的几率就是19/99 否则就是20/99
不考虑公平的话
小朋友先随机排序后直接分给前20个
97095639 2009-11-06
  • 打赏
  • 举报
回复
帮顶
huisui1234 2009-11-06
  • 打赏
  • 举报
回复
数据几十万有什么差别吗?再多的数据到最后的结果都是小于100的情况,几十万的时候肯定所有人都分配到一定数量的礼物,都是一样多的 实际到最后不一样的时候就是省下来小于100的 情况 直接取余100 剩下的小于100的随机分配不就可以了啊
bawgiitx 2009-11-06
  • 打赏
  • 举报
回复
给个新思路
散列,只产生一个随机数,直接通过一个表达式计算出每个礼物所属的小朋友id
JavaAlpha 2009-11-05
  • 打赏
  • 举报
回复
帮顶
alpha 2009-11-05
  • 打赏
  • 举报
回复
有意思 晚上睡觉时好好考虑以下。 帮顶
sunhaidan 2009-11-05
  • 打赏
  • 举报
回复
还有一个思路:
先求出每个小朋友可以领的最多的礼品数量
随机小朋友顺序
再由小朋友来领
并判断剩余礼品数量大于未领礼品的小朋友数量
就可以了

但愿可以帮到你

呵呵
sunhaidan 2009-11-05
  • 打赏
  • 举报
回复
我也只有普通的方法:
将一百个小朋友先随机排序
再用循环顺序派发
直至没有礼物

至于你说的弊端
我想至少按我的理解来说是不可避免的
反正是派发礼品数量的次数

如果说这样都不可以避免
我愿意学习

呵呵



BraveHorse 2009-11-05
  • 打赏
  • 举报
回复
对于这个算法问题,最终分来分去的就是减去平均数剩下的(计为count)。这些count个礼物就是随机分配。
使用数组移位与使用set的却别在于,使用数组移位循环次数是固定的,循环次数=count,这是因为每次必产生一个有效的随机数;使用set循环次数是不固定的,循环次数>=count,这是因为产生的随机数有可能已经被分配过,无效了。因此这个算法其实最终就是怎样减少循环,对于随机分配的循环次数也需要考虑。可控的循环很重要。
yaa2004 2009-11-04
  • 打赏
  • 举报
回复
我认为多次循环不可取,应该把礼物固定,人随机,也就是说一次数据遍历得到
如果小于100 随机出得到1个礼物的人
如果大于100小于200
如: 120礼物,肯定有20个人有两份,首先先随机出得到两份礼物的20个人,处理完这20个人以后,再处理剩余一人一份的情况
同样如果大于200小于300
如: 320礼物,肯定有20个人有三份,首先先随机出得到三份礼物的20个人,处理完这20个人以后,再处理剩余一人两份的情况

以此类推

只是中间多了判断条件,但是这样不用循环,一次都能够处理完毕

jarvis_java 2009-11-04
  • 打赏
  • 举报
回复
10万份礼物分给100个人 与其处理10W分礼物怎么分
到不如处理100个人 让他们顺序拿完这礼物 循环10W和循环100那不是一个概念
alexander_david 2009-11-04
  • 打赏
  • 举报
回复
这么多解答,大概楼主现在的头比原来更大了……
小崔爱读书 2009-11-03
  • 打赏
  • 举报
回复
public static void main(String[] args) throws Exception {


Random rnd=new Random();

//随机生成豆子数
int douzi=rnd.nextInt(300);
int children=100;

//得到豆子的余数
int remainder=douzi%children;
//得到豆子的平均整数
int per=douzi/children;

//用于存储每个小朋友应分配到的豆子数
Integer[] childDouzi=new Integer[100];

//用于临时保存随机分配的0-99的数字,以判断新随机生成的数字是否已经存在。
Set<Integer> iset=new HashSet<Integer>();

for(int i=0;i<100;i++){
int ri=rnd.nextInt(100);
if(iset.contains(ri)){
i--;
}
else{
iset.add(ri);

if(ri+1>remainder){
childDouzi[i]=per;
}
else{
childDouzi[i]=per+1;
}

}
}
}
oscarshou 2009-11-03
  • 打赏
  • 举报
回复
同意96楼的观点,如果少于礼物数量Num>100&&Num<200则没人1份,先去掉100份,剩下的Num-100再分,至于算法嘛,前面很多人都讲了,我习惯用JAVA,Set这个类不允许添加重复的数,可以利用这个特点:
public static void main(String[]args){
int num=115;
Set hs=new HashSet();
num =(int)(num%100);
int getPresent=0;
int radnum;
boolean b;
while (true){
radnum=(int)(Math.random()*100);//随机产生1~100的整数
b=hs.add(radnum);
if (b) //如果Set里面没有重复的就能添加成功,否则添加不成功
getPresent++;
if (getPresent==num) break;
}
Iterator it=hs.iterator();
while (it.hasNext()){
System.out.println(it.next());
}
}
以115举例,没人分得1份礼物,其余随机挑15人每人分1份,最终it里面迭代出来就是那15个人
阿_布 2009-11-03
  • 打赏
  • 举报
回复
顶!
97095639 2009-11-03
  • 打赏
  • 举报
回复
记下,有空研究
加载更多回复(255)

81,091

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧