/*3.變態(tài)比賽規(guī)則
為了促進(jìn)各部門員工的交流,百度舉辦了一場(chǎng)全公司范圍內(nèi)的“拳皇”(百度內(nèi)部最流行的格斗游戲)友誼賽,負(fù)責(zé)組織這場(chǎng)比賽的是百度的超級(jí)“拳皇”迷W.Z。W.Z不想用傳統(tǒng)的淘汰賽或者循環(huán)賽的方式,而是自己制定了一個(gè)比賽規(guī)則。
由于一些員工(比如同部門或者相鄰部門員工)平時(shí)接觸的機(jī)會(huì)比較多,為了促進(jìn)不同部門之間的交流,
W.Z希望員工自由分組。不同組之間的每?jī)蓚€(gè)人都會(huì)進(jìn)行一場(chǎng)友誼賽而同一組內(nèi)的人之間不會(huì)打任何比賽。
比如4個(gè)人,編號(hào)為1~4,如果分為兩個(gè)組并且1,2一個(gè)組,3,4一個(gè)組,那么一共需要打四場(chǎng)比賽:
1 vs 3,1 vs 4,2 vs 3,2 vs 4。 而如果是1,2,3一組,4單獨(dú)一組,那么一共需要打三場(chǎng)比賽:
????? 1 vs 4,2 vs 4,3 vs 4。
很快W.Z意識(shí)到,這樣的比賽規(guī)則可能會(huì)讓比賽的場(chǎng)數(shù)非常多。W.Z想知道如果有N個(gè)人,
通過上面這種比賽規(guī)則,總比賽場(chǎng)數(shù)有可能為K場(chǎng)嗎?比如3個(gè)人,如果只分到一組則不需要比賽,
如果分到兩組則需要2場(chǎng)比賽,如果分為三組則需要3場(chǎng)比賽。但是無論怎么分都不可能恰需要1場(chǎng)比賽。
相信作為編程高手的你一定知道該怎么回答這個(gè)問題了吧? 那么現(xiàn)在請(qǐng)你幫助W.Z吧。
輸入要求:
每行為一組數(shù)據(jù),包含兩個(gè)數(shù)字 N, K(0<N<=500, K>=0)。例:
2 0
2 1
3 1
3 2
?
輸出要求:
對(duì)輸入的N,K 如果N個(gè)員工通過一定的分組方式可以使比賽場(chǎng)數(shù)恰好為K,則輸出"YES",否則輸出"NO"
(請(qǐng)全部使用大寫字母),每組數(shù)據(jù)占一行。例:
YES
YES
NO
YES
*/
/*
算法分析:采用遞歸的方法,原理較簡(jiǎn)單,大家看源碼即可。
*/
/*
? Name:
? Copyright:
? Author:
? Date: 27-05-06 15:37
? Description:
*/
#include <iostream>
#include<fstream>
#include <time.h>
using namespace std;
const int MAX = 100;
void Readata(const char *filename);
bool check(long n, long k);
int main()
{
?time_t startTime;
?time_t endTime;
?time(&startTime);
?Readata("in.txt");
?time(&endTime);
?cout << difftime(endTime, startTime) << endl;
?getchar();
?return 0;
}
void Readata(const char *filename)
{
????? fstream in(filename);
????? if (!in)
??????????? return ;?? //結(jié)束程序執(zhí)行
????? while (!in.eof())
????? {
??????????? long data[2];
??????????? in >> data[0];
??????????? in >> data[1];
??????????? //cout << data[0] << ' ' << data[1] << endl;
??????????? if (check(data[0], data[1]))
????????????????? cout << "YES" << endl;
??????????? else
????????????????? cout << "NO" << endl;
????? }
??? in.close(); //關(guān)閉文件
}
bool check(long n, long k)
{
??? bool flag = false;
??? int i;
??? if(k == 0) //可能? 。。。1
??????? return true;
??? if(n==0 && k || k<0)? //不可能 。。。2
??????? return false;
??? for(i=1; i<n && !flag; i++) //i表示將被減掉的小組的人數(shù),每少一個(gè)由i個(gè)人組成的組就會(huì)少(n-i) * i場(chǎng)比賽
??????? flag = check(n-i,k - (n-i) * i);? //不斷的減少小組數(shù)和對(duì)應(yīng)減少的比賽次數(shù),直到出現(xiàn)1或2的情況 (出現(xiàn)可能的情況也會(huì)終止分析)
??? return flag;
}