对决

来源:互联网 发布:细集料坚固性试验数据 编辑:程序博客网 时间:2024/06/10 01:40

对决

时间限制:1000 ms  |  内存限制:65535 KB
难度:0
描述

Topcoder 招进来了 n 个新同学,Yougth计划把这个n个同学分成两组,要求每组中每个人必须跟另一组中每个同学进行一次算法对决,问存不存在一种分组方式在k场完成对决。(两组中每一组中人数都要大于0)

输入
有多组测试数据,每组测试数据两个数 n 和 k ,n和k都为0时表示输入结束。(0<n<10000,0<k<1000000)
输出
输出一行,如果可以,输出YES,不行的话输出NO。
样例输入
4 14 34 42 13 30 0
样例输出
NOYESYESYESNO
提示
4个人分成两组,1和3则需对决3场,2和2则需对决4场。
来源
Yougth原创
上传者

TC_杨闯亮


问题链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=813

问题分析:

设y为分组情况为(x,n-x)情况下的比赛次数,则y=x(n-x)  其中x>=1且为整数。因为y=x(n-x) 由求根公式

  • formula带入可以求出x。问题就转换为是否存在一个y,使得x为整数。
  • 从理论上分析后再看题目可以用程序来模拟所有可能,从而来判断是否有满足条件的分组情况,如代码所示。
  • (一开始看错题了,以为是让求是否在k次内比完的,后来发现是要求正好k场比完。)
  • 代码:
  • #include <iostream>#include <stdio.h> #include <string.h>#include <math.h>#include <vector>#include <queue>#include <stack>#include <map>#include <string>#include <algorithm>using namespace std; /* run this program using the console pauser or add your own getch, system("pause") or input loop */int main(int argc, char** argv) {int n,k;while(scanf("%d%d",&n,&k)!=EOF&& (n != 0 || k!=0)){for(int i=1;i<n/2+1;i++){if(k == i*(n-i)){printf("YES\n");goto loop;}}printf("NO\n");loop:;}return 0;}