拳皇争霸

来源:互联网 发布:蛮族勇士.知乎 编辑:程序博客网 时间:2024/04/29 09:07

为了促进各部门员工的交流,公司举办了一场全公司范围内的" 拳皇友谊赛" ,负责组织这场比赛的是公司的超级" 拳皇" 迷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

#include<iostream>using namespace std;void operate(int sum,int match);//判断人数sum是否能组成match数量的比赛     sum——总人数,match——输入判断场数struct match_number{int person,match;}match_num[50];int flag;//标志是否match成立int main(){int n;//测试数量cout<<"输入测试组数:";cin>>n;for(int i=0;i<n;i++){cin>>match_num[i].person>>match_num[i].match;}for(int j=0;j<n;j++){flag=0;operate(match_num[j].person,match_num[j].match);if(flag)cout<<"YES"<<endl;elsecout<<"NO"<<endl;}system("pause");return 0;}void operate(int sum,int match){if(!match)//当match为0时总是成立flag++;for(int i=1;i<=(sum+1)/2;i++)//注意临界情况,sum/2,当sum=3时,sum/2=1,无法测试继续(2,1){if(i*(sum-i)==match){flag++;break;}else if(i>1&&(match-i*(sum-i))>0)//判断划分的划分match的存在operate(i,match-i*(sum-i));}}