程序设计:变态比赛规则

原创 2006年05月28日 22:21:00

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 <stdio.h>
#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;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

"百度之星"程序设计大赛试题解答(Java实现)---变态的比赛规则(未完成!!!)

悲催啊,弄了整整一下午还是没有完整滴弄出来 不得不承认我智商很一般,搞这个整数划分的算法搞了近1个小时才弄明白,可是,这道变态的题目并不是这样简单啊!!!忍无可忍,只好站在前人的肩膀上了来做了一位是...

2006年百度之星程序设计大赛试题初赛题目-题3-变态的比赛规则

变态的比赛规则  为了促进各部门员工的交流,百度 (baidu) 举办了一场全公司范围内的 " 拳皇友谊赛 " ,负责组织这场比赛的是百度的超级 " 拳皇 "...

php解:2006 年百度之星程序设计大赛初赛题目 3 ----变态的比赛规则

2006 年百度之星程序设计大赛初赛题目 3 变态的比赛规则 为了促进各部门员工的交流,百度 (baidu) 举办了一场全公司范围内的 " 拳皇友谊赛 " ,负责组织这场比赛的是百度的超级 " 拳皇 ...
  • wxhlxx
  • wxhlxx
  • 2011-06-04 20:57
  • 1058

变态的比赛规则

  • 2014-03-27 09:39
  • 406B
  • 下载

ACM2、变态的比赛规则

2006 年百度之星程序设计大赛初赛题目 3  变态的比赛规则  为了促进各部门员工的交流,百度 (baidu) 举办了一场全公司范围内的 " 拳皇友谊赛 " ,负责组织这场比赛的是百度的...

飞思卡尔比赛规则

  • 2014-07-13 18:12
  • 1022KB
  • 下载

关于codeforces比赛规则介绍(转载)

Codeforces 简称: cf(所以谈论cf的时候经常被误会成TX的那款游戏). 网址: codeforces.com   这是一个俄国的算法竞赛网站,由来自萨拉托夫州立大学、由Mike M...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)