求一算法

zhufeiguanghui 2008-12-23 01:14:44

现在要求给N个人分组,组数是从1到N,不同组中的任意两个人进行比赛,同一组的人之间不进行比赛,求比赛的总次数可能为多少?
...全文
130 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
yinjor 2008-12-24
  • 打赏
  • 举报
回复
按各队按人数大小由大到小排序.

5,4,3,2

5*(4+3+2) + 4*(3+2) + 3*(2)

看到这个过后,我想就应该没问题了吧

zlshum 2008-12-24
  • 打赏
  • 举报
回复
这个问题是集合的划分等价类个数问题的演变问题

(1)求得n的所有等价类个数B(n)=Sum{k=0,n-1}B(k)Cnk B(0)=B(1)=1(这个组合数学书上有很多证明,Cnk表示组合数n中树中取k个不同数的个数)

(2)B(n)就是所有的分组数,现在再看一下一个分组情况下一个分组时候有多少比赛?
设有p个分组,a[p]表示每个对应组中的人数,则有
约束:Sum{i=0,p-1}a[i]=N,a[i]>=1
比赛总数为:
Sum{i=0,p-1}(N-Sum{k=0,i}a[k])a[i]

(3)将上面两个综合分析,不难得出结论:同样是一个递归式
就是所有比赛数
C(n) = Sum{k=0,n-1} C(k)Cnk(n-k)k
这里c(0)=0,c(1)=1(实际上c(1)=0(忽略))





caremsi 2008-12-23
  • 打赏
  • 举报
回复
mark,顶
wiowei 2008-12-23
  • 打赏
  • 举报
回复
百度之星这题我用DP做了下,lz可以参考下,仅用了些数据测试,不保证是答案。。。
http://blog.csdn.net/wiowei/archive/2008/12/23/3590504.aspx
sincor 2008-12-23
  • 打赏
  • 举报
回复
我觉得你可以去研究研究书上有个例子 就是打印 乘法口诀表
zhufeiguanghui 2008-12-23
  • 打赏
  • 举报
回复
其实这是百度之星程序设计大赛的试题,想了半天也没想出个好思路来,高手快来啊,原题如下:

为了促进各部门员工的交流,百度 (baidu) 举办了一场全公司范围内的 " 拳皇友谊赛 " ,负责组织这场比赛的是百度的超级 " 拳皇 " 迷 W.Z. W.Z 不想用传统的淘汰赛或者循环赛的方式,而是自己制定了一个比赛规则。
由于一些员工(比如同部门或者相临部门员工)平时接触的机会比较多,为了促进不同部门之间的交流, W.Z 希望员工自己组成不同组。不同组之间的每两个人都会进行一场友谊赛而同一组内的人则之间不会打任何比赛。
比如 4 个人,编号为 1--4, 如果分为两个组并且 1,2 一个组, 3 , 4 一个组,那么一共需要打四场比赛: 1 vs 3,1 vs 4,2 vs 3,2 vs 4. 而如果是 1,2,3 一组, 4 单独一组,那么一共需要打三场比赛 : 1 vs 4,2 vs 4,3 vs 4.
很快 W.Z 意识到,这样的比赛规则可能会让比赛的场数非常多。 W.Z 想知道如果有 N 个人 , 通过上面这种比赛规则,总比赛场数有可能为 K 场吗?比如 3 个人,如果只分到一组则不需要比赛,如果分到两组则需要 2 场比赛 , 如果分为三组则需要 3 场比赛。但是无论怎么分都不可能只需要 1 场比赛。
相信作为编程高手的你一定知道该怎么回答这个问题了吧? 那么现在请你帮助 W.Z 吧。
输入
每行为一组数据,包含两个数字 N, K 。 (0<N<=500, K>=0)
输出
对输入的 N,K 如果 N 个员工通过一定的分组方式可能会一共需要 K 场比赛,则输出 "YES", 否则输出 "NO", 每组数据占一行。
所有的输入输出均为标准输入输出。
例子
输入文件 :
2 0
2 1
3 1
3 2
输出 :
YES
YES
NO
YES
Jack_xiao 2008-12-23
  • 打赏
  • 举报
回复
没有限定必须每个人都参加,每个人参加的次数
可能性太多了
zhaolinger2 2008-12-23
  • 打赏
  • 举报
回复
更明确的算法:

定义sum=0
分组数从1到N循环
计算将N个人分配到每个循环中的分组中的所有分配方案
统计处以上的分配方案的总数
组号从1到分配方案的总数循环
根据每一个组的人数n,计算n*(n-1)/2并累计到sum中
组号循环结束
分组数循环结束
输出sum。
zhaolinger2 2008-12-23
  • 打赏
  • 举报
回复
可能性太多了。

基本思路是:首先确定分多少组,然后分别确定每个组的人数,再根据每个组的人数计算每个组各自需要比赛的次数(单循环的比赛次数是n*(n-1)/2),然后再把所有的加起来,over.

65,211

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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