AStar2006 --- 变态比赛规则问题

来源:互联网 发布:seo网站服务公司 编辑:程序博客网 时间:2024/04/25 21:14

 

变态比赛规则问题

 

为了促进各部门员工的交流,百度举办了一场全公司范围内的拳皇(百度内部最流行的格斗游戏)友谊赛,负责组织这场比赛的是百度的超级拳皇W.ZW.Z不想用传统的淘汰赛或者循环赛的方式,而是自己制定了一个比赛规则。

 

由于一些员工(比如同部门或者相邻部门员工)平时接触的机会比较多,为了促进不同部门之间的交流,W.Z希望员工自由分组。不同组之间的每两个人都会进行一场友谊赛而同一组内的人之间不会打任何比赛。

 

比如4个人,编号为1~4,如果分为两个组并且12一个组,34一个组,那么一共需要打四场比赛:1 vs 31 vs 42 vs 32 vs 4 而如果是123一组,4单独一组,那么一共需要打三场比赛: 1 vs 42 vs 43 vs 4

 

很快W.Z意识到,这样的比赛规则可能会让比赛的场数非常多。W.Z想知道如果有N个人,通过上面这种比赛规则,总比赛场数有可能为K场吗?比如3个人,如果只分到一组则不需要比赛,如果分到两组则需要2场比赛,如果分为三组则需要3场比赛。但是无论怎么分都不可能恰需要1场比赛。

 

相信作为编程高手的你一定知道该怎么回答这个问题了吧? 那么现在请你帮助W.Z吧。

 

输入要求:

每行为一组数据,包含两个数字 N, K(0<N<=500, K>=0)。例:

2 0

2 1

3 1

3 2

样例:in.txt

 

输出要求:

对输入的N,K 如果N个员工通过一定的分组方式可以使比赛场数恰好为K,则输出"YES",否则输出"NO"(请全部使用大写字母),每组数据占一行。例:

YES

YES

NO

YES

样例:out.txt

 

评分规则:

1.程序将运行在一台Linux机器上(内存使用不作严格限制),在每一测试数据集上运行不能超过10秒,否则该用例不得分;

2.要求程序能按照输入样例的格式读取数据文件,按照输出样例的格式将运行结果输出到标准输出上。如果不能正确读入数据和输出数据,该题将不得分;

3.该题目共有3个测试数据集,每个测试数据集为一个输入文件。各测试数据集占该题目分数的比例分别为30%30%40%

4.该题目20分。

 

 

以下是我的想法:

百度一共有N个员工, 按照一定的分组方式会有K场比赛.

不妨假设分为x, 那么每组的人数分别为A1, A2, A3 … Ax

满足 A1+A2+A3+…+Ax = N;

对于第1组来说,他们队员一共需要跟第2组,第3x组进行比赛,那么一共需要

进行 A1*A2 + A1*A3 + …+A1*Ax 场比赛, 也就是A1*(A2+A3+…+Ax)场比赛。

对于第2组来说, 一共需要 A2*(A1+A3+…+Ax)比赛

……

对于第x组来说, 一共需要 Ax*(A1+A3+…+A(x-1))比赛

 

那么一共进行的比赛场数就是:

A1*(A2+A3+…+Ax)  + A2*(A1+A3+…+Ax) + Ax*(A1+A3+…+A(x-1))

由于A1+A2+A3+…+Ax = N

那么式转变为

A1*(N-A1)  + A2*(N-A2) + … +Ax*(N-Ax)

A1*N-A1*A1 + A2*N-A2*A2  + … + Ax*N -Ax*Ax

N(A1+A2+…+Ax) – (A1*A1+A2*Ax+…+Ax*Ax)

N*N - (A1*A1+A2*Ax+…+Ax*Ax)

由于重复了1

那么 K = (N*N - (A1*A1+A2*Ax+…+Ax*Ax))/2;

: N*N-2K = A1*A1+A2*Ax+…+Ax*Ax;

也就是说, 如果从多个分组方式里头找到满足上式的一个分组方式就正确,

如果找不到就错误

 

虚代码如下:

/* 返回0则无法分组, 返回1则分组成功 */

int grouping(int NVal, int KVal)

{

char result = 0;

 

int N = NVal;

int K = KVal;

 

我再好好想想………….

 

return result;

}

原创粉丝点击