3.变态比赛规则
为了促进各部门员工的交流,百度举办了一场全公司范围内的“拳皇”(百度内部最流行的格斗游戏)友谊赛,负责组织这场比赛的是百度的超级“拳皇”迷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)。例:
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分。
解答:#include <stdlib.h>
#include <string.h>
#define Q3_TRUE 1
#define Q3_FALSE 0
char ProcessNKM(long lN, long lK, long lM)
{
long i;
long lLast;
if (lK < 0)
{
return Q3_FALSE;
}
if (0 == lK
|| lN - 1 == lK
|| (lN * (lN - 1) >> 1) == lK)
{
return Q3_TRUE;
}
if (lK < lN - 1)
{
return Q3_FALSE;
}
if (lM > 2)
{
for (lLast = 1; lLast <= lN / (lM - 1); lLast++)
{
if (ProcessNKM(lN - lLast, lK - lLast * (lN - lLast), lM - 1))
{
return Q3_TRUE;
}
}
}
else
{
for (i = 1; i <= (lN >> 1); i++)
{
if (lK == i * (lN - i))
{
return Q3_TRUE;
}
}
}
return Q3_FALSE;
}
char ProcessNK(long lN, long lK)
{
long lM, lLast;
for (lM = 2; lM < lN; lM++)
{
if (ProcessNKM(lN, lK, lM))
{
return Q3_TRUE;
}
}
return Q3_FALSE;
}
int main(int argc, char* argv[])
{
FILE * fp = fopen(argv[1], "r");
int lN, lK;
int i;
long lPrice = 0;
char szBuf[100];
char szNum[100];
while (!feof(fp))
{
fgets(szBuf, 100, fp);
for (i = 0; ' ' != szBuf[i]; i++)
{
/* nothing */
}
strncpy(szNum, szBuf, i);
szNum[i] = '/0';
lN = atol(szNum);
for (i++; ' ' == szBuf[i]; i++)
{
/* nothing */
}
strcpy(szNum, szBuf + i);
lK = atol(szNum);
if (0 == lK
|| lN - 1 == lK
|| (lN * (lN - 1) / 2) == lK)
{
puts("YES");
continue;
}
if (lK < lN - 1)
{
puts("NO");
continue;
}
if (lK > lN * lN / 3)
{
puts("NO");
continue;
}
if (ProcessNK(lN, lK))
{
puts("YES");
}
else
{
puts("NO");
}
}
fclose(fp);
return 0;
}