程序设计:变态比赛规则

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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
为了促进各部门员工的交流,百度举办了一场全公司范围内的“拳皇”(百度内部最流行的格斗游戏)友谊赛,负责组织这场比赛的是百度的超级“拳皇”迷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场比赛。 输入要求: 每行为一组数据,包含两个数字 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
#include #include #include #include #include #define N 100 int n=0; int Checktoseek(char name[]);//查找 void mainmenu();//菜单 void Register();//登记注册 void Showplayer();//显示当前人物数据 void Showallplayer();//显示所有人物数据 void Chooseopponent();//选择对手 void Chooseplayer(int i);//选择角色 void vs(int i,int j);//PK void Attack(int i,int j);//攻击 void recovery(int i,int j);//防御 void Energy(int i,int j);//能量 struct Kof { char name[20]; int Hp; int AP; int Dp; int Rp; }player[N]; void main() { srand(unsigned(time(NULL))); mainmenu(); } void login() { } void mainmenu() { while(1) { int x; printf("\n"); printf("\n"); printf(" ***************************************************************\n"); printf(" *** ***\n"); printf(" *** ***\n"); printf(" *** 欢迎进入Kof ***\n"); printf(" *** ***\n"); printf(" *** ***\n"); printf(" ***************************************************************\n"); printf("\t\t\t\t\t1----请先注册\n"); printf("\t\t\t\t\t2----查看玩家信息\n"); printf("\t\t\t\t\t3----查看自己信息\n"); printf("\t\t\t\t\t4----选择对手\n"); printf("\t\t\t\t\t5----结束\n"); printf("\n\n请选择菜单:"); scanf("%d",&x); if(x==5) break; switch(x) { case 1:Register();break; case 2:Showallplayer();break; case 3:Showplayer();break; case 4:Chooseopponent();break; } printf("\n\n\n\n\n按任意键继续:"); getch(); system("cls"); } } void Register() { char name[20]; printf("输入名称:"); fflush(stdin); gets(name); if(Checktoseek(name)==-1) { strcpy(player[n].name,name); player[n].Hp=rand()%1000; player[n].AP=rand()%(100+1)+50; player[n].Dp=rand()%(10-5+2)+5; player[n].Rp=rand()%(60+2)+60; n++; printf("人物创建成功\n"); } else { Register(); } } void Showplayer() { char name[20]; printf("角色名:"); fflush(stdin); gets(name); int i=Checktoseek(name); if(i!=-1) { printf("人物名称:%s\n",player[i].name); printf("Hp:%d\n",player[i].Hp); printf("Ap:%d\n",player[i].AP); printf("Dp:%d\n",player[i].Dp); printf("Rp:%d\n",player[i].Rp); } else { printf("请重新输入角色名"); Showplayer(); } } void Showallplayer() { printf("%-10s%-10s%-10s%-10s%-10s\n","Name","Hp","Ap","Dp","Rp"); for(int i=0;i<n;i++) { printf("%-10s%-10d%-10d%-10d%-10d\n",player[i].name,player[i].Hp,player[i].AP,player[i].Dp,player[i].Rp); } } void Chooseopponent() { char name[20]; int i; Showallplayer(); printf("你选择PK谁:"); fflush(stdin); gets(name); i=Checktoseek(name); if(i!=-1) { Chooseplayer(i); } else { printf("你选择PK的人物找不到?\n"); Chooseopponent(); } } int Checktoseek(char name[]) { for(int i=0;i0 && player[j].Hp>0) { printf("第%d局***************\n",count); if(count%2==0) { Attack(i,j); recovery(i,j); Energy(i,j); } else { Attack(j,i); recovery(i,j); Energy(i,j); } count++; _sleep(3344); } if(player[i].Hp>0) { printf("%s Victory \n",player[i].name); } else { printf("%s Winner \n",player[j].name); } printf("******************************\n"); } void Attack(int i,int j) { int x; int s; x=rand()%5; switch(x) { case 0: printf("\n%s发出波动伤害%s\n",player[i].name,player[j].name); s=rand()%100; player[j].Hp-=s; printf("%s受到%d点伤害\n\n",player[j].name,s); break; case 1: printf("\n%s使用连招攻击%s\n",player[i].name,player[j].name); s=rand()%100*2; player[j].Hp-=s; printf("%s受到%d点伤害\n\n",player[j].name,s); break; case 2: printf("\n%s释放超杀技\n",player[i].name); s=(rand()%100)*4; player[j].Hp-=s; printf("%s受到%d点伤害\n\n",player[j].name,s); break; } } void recovery(int i,int j) { int s; int x; s=rand()%3; switch(s) { case 0: printf("\n%s防御%s的攻击\n",player[i].name,player[j].name); x=rand()%(10-5+2)+5; player[i].Dp==x; printf("%s抵挡%d点伤害\n\n",player[i].name,x); break; case 1: printf("\n%s防御%s的攻击\n",player[j].name,player[i].name); x=rand()%(10-5+2)+5; player[j].Dp==x; printf("%s抵挡%d点伤害\n\n",player[j].name,x); break; } } void Energy(int i,int j) { int x; int s; x=rand()%6; switch(x) { case 0: printf("\n%s大怒,使用超必杀技\n",player[i].name); s=(rand()%100)*6; player[j].Hp-=s; printf("%s受到%d点伤害\n\n",player[j].name,s); break; case 1: printf("\n%s大怒,使用超必杀技\n",player[j].name); s=(rand()%100)*6; player[i].Hp-=s; printf("%s受到%d点伤害\n\n",player[i].name,s); break; } }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值