百度之星比赛规则
為了促進各部門員工的交流,百度舉辦了一場全公司范圍內的“拳皇”(百度內部最流行的格斗游戲)友誼賽,負責組織這場比賽的是百度的超級“拳皇”迷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
?
輸出要求:
對輸入的N,K 如果N個員工通過一定的分組方式可以使比賽場數恰好為K,則輸出"YES",否則輸出"NO"(請全部使用大寫字母),每組數據占一行。例:
YES
YES
NO
YES
?
?
代碼如下:
1 #include<stdio.h> 2 #include<conio.h> 3 int result[500]; 4 int status[1000]={0}; 5 int sum(int *a, int len) 6 { 7 int sum = 0, i, j; 8 for (i = 0; i < len; ++i) { 9 for(j = i + 1; j < len; ++j) { 10 sum += a[i] * a[j]; 11 } 12 } 13 return sum; 14 } 15 void split(int n, int k, int c) 16 { 17 if (k == 0) return; 18 if (n == k) 19 {21 result[c]=k; 22 status[sum(result,c+1)]=1; 23 if (k == 1)return; 24 } 25 int i = k; 26 for (;i >= 1; i--) 27 { 28 result[c] = i; 29 split(n - i, i < n - i ? i : n - i, c + 1); 30 } 31 } 32 33 int main() 34 { 35 int n,k; 36 scanf("%d %d",&n,&k); 37 if(n<1||n>500||k<0) 38 return 0; 39 split(n, n - 1, 0); 40 if(!k||status[k])printf("YES!\n"); 41 else printf("NO!\n"); 42 getch(); 43 return 0; 44 }
?
轉載于:https://www.cnblogs.com/dzqdzq/archive/2013/04/20/3032105.html
總結
- 上一篇: 问卷星的自动答题脚本
- 下一篇: Spring Boot菜鸟示例——Hel