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

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

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

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

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

也是个大家交流的机会
...全文
141 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
SuperTyro 2009-10-27
  • 打赏
  • 举报
回复
非要拼效率?
坚决不用集合,用数组
坚决不用for,用while
坚决不用/,用>>
takako_mu 2009-10-27
  • 打赏
  • 举报
回复
先除后減,有啥高效的?
lya2008 2009-10-27
  • 打赏
  • 举报
回复
using System;
using System.Collections.Generic;
using System.Text;

namespace gift
{
class Program
{
static void Main(string[] args)
{
int peopleNum = 0;
int giftNum = 0;
Console.WriteLine("请输入要礼物的人数");
string s = Console.ReadLine();
peopleNum = Convert.ToInt32(s);
Console.WriteLine("请输入要发的礼物数");
string g = Console.ReadLine();
giftNum = Convert.ToInt32(g);
dogigt(peopleNum, giftNum);

}


public static void dogigt(int peopleNum, int giftNum)
{
int mincount = giftNum / peopleNum;
if (mincount == 0)
{
mincount = 1;
}
int maxcount = 0;
int temp = 0;
int[] people = new int[peopleNum];

List<int> list = new List<int>();

Random ran = new Random();
if (giftNum > peopleNum)
{
maxcount = mincount + 1;
}
else
{
maxcount = mincount;
}
int num = giftNum;
while (num > 0)
{
temp = ran.Next(0, peopleNum);
if (list.Contains(temp))
{
continue;
}
list.Add(temp);
if (list.Count % peopleNum == 0)
{
list.Clear();
}
if (people[temp] < maxcount)
{
people[temp] += 1;
num--;
}
}

for (int i = 0; i < people.Length; i++)
{
Console.WriteLine(people[i].ToString());
}
Console.ReadLine();
}
}
}
zhong2006 2009-10-27
  • 打赏
  • 举报
回复

int sum = 234;
int aa = 100;
string randomCode = "";
ArrayList li = new ArrayList();
for (int i = 1; i <= aa; i++)
{
li.Add(i);
}
int num = sum / aa;
int ys = sum % aa;
Random rand = new Random();

for (int j = 1; j <= ys; j++)
{
rand = new Random(j * ((int)DateTime.Now.Ticks));
int t = rand.Next(aa);
randomCode += li[t]+",";
li.RemoveAt(t);
aa--;
}
Response.Write(randomCode);
//每个人至少有num 个,其中在randomCode中的人有num+1个
zhong2006 2009-10-27
  • 打赏
  • 举报
回复

int sum = 234;
int aa = 100;
string randomCode = "";
ArrayList li = new ArrayList();
for (int i = 1; i <= aa; i++)
{
li.Add(i);
}
int num = sum / aa;
int ys = sum % aa;
Random rand = new Random();

for (int j = 1; j <= ys; j++)
{
rand = new Random(j * ((int)DateTime.Now.Ticks));
int t = rand.Next(aa);
randomCode += li[t]+",";
li.RemoveAt(t);
aa--;
}
Response.Write(randomCode);

写出来种,各位大哥鉴定鉴定
我姓区不姓区 2009-10-27
  • 打赏
  • 举报
回复

static void Main(string[] args)
{
Gift(100, 245);
}

static void Gift(int people, int gift)
{
if (people > gift)
{
bool[] temp = new bool[people];
Random r = new Random(Environment.TickCount);
while (gift > 0)
{
int i = r.Next(0, people);
if (!temp[i])
{
temp[i] = true;
gift--;
}
}
for (int i = 0; i < people; i++)
{
if (temp[i])
Console.WriteLine("第{0}位得到了1份礼物", i + 1);
}
}
else if (people == gift)
{
Console.WriteLine("每人都拿到一份礼物");
}
else
{
int each = gift / people;
int left = gift % people;
bool[] temp = new bool[people];
Random r = new Random(Environment.TickCount);
while (left > 0)
{
int i = r.Next(0, people);
if (!temp[i])
{
temp[i] = true;
left--;
}
}
for (int i = 0; i < people; i++)
{
Console.WriteLine("第{0}位得到了{1}份礼物", i + 1, each + (temp[i] ? 1 : 0));
}
}
}
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 zhouyanfss 的回复:]
这个跟那个随机发牌程序相似
首先计算没人至少几分,最多几份!
可以声请string[a] arr保存礼物,a为礼物数量,a/100为至少份数设为min,a%100!=0 最多max=++min;否则max=min;
然后取随机数,第一次取0-(a-1)之间的一个随机数,假设b,则将arr[b]与arr[a-1]位置互换!(意识是arr[b]这个礼物已经被分配,下此取随机数是从0-(a-1)之间取,然后与arr[a-2]互换),以此类推,取到min个分配给一个人,当所有人都分配完后,剩下的,人手一份,随机取人
[/Quote]

但是这样的弊端是,在人数和礼品数比较少时可以,就像我上面举得数字,
可以若是几万,几十万,这种解决方法的效率就会越来越差
TalesTen 2009-10-27
  • 打赏
  • 举报
回复
。。。。。。。
randomfeel 2009-10-27
  • 打赏
  • 举报
回复
i = 礼物数 % 100
j = 礼物数 / 100
随即选i个人,这i个人是j+1个
没选到的人是j个
jimstone 2009-10-27
  • 打赏
  • 举报
回复
是啊,这个很难预测的
sxmonsy 2009-10-27
  • 打赏
  • 举报
回复
双色球预测准不准呀。
zhong2006 2009-10-27
  • 打赏
  • 举报
回复
哈哈,我就做了个这样的,双色球预测,自己拿来买双色球
zhong2006 2009-10-27
  • 打赏
  • 举报
回复
礼物数量/100的余数,
然后在数字1-100的集合里随机取值余数次,在这里,被取值一次就从集合里剔除出去,然后接着取
zhouyanfss 2009-10-27
  • 打赏
  • 举报
回复
这个跟那个随机发牌程序相似
首先计算没人至少几分,最多几份!
可以声请string[a] arr保存礼物,a为礼物数量,a/100为至少份数设为min,a%100!=0 最多max=++min;否则max=min;
然后取随机数,第一次取0-(a-1)之间的一个随机数,假设b,则将arr[b]与arr[a-1]位置互换!(意识是arr[b]这个礼物已经被分配,下此取随机数是从0-(a-1)之间取,然后与arr[a-2]互换),以此类推,取到min个分配给一个人,当所有人都分配完后,剩下的,人手一份,随机取人
gongsun 2009-10-27
  • 打赏
  • 举报
回复
...
SQL77 2009-10-27
  • 打赏
  • 举报
回复
这个不难吧,呵呵,只是除法,判断是否比100大,不大就随机抽取那么多人,每人一个
比100大的,除100的商平均分给每个人,余数再抽取随机平均分配.......

不知道是不是这样理解

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

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