没什么注释。。
作过的看看能不能再快一点
主题贴子在这里。。。。
http://www.iteye.com/post/307049
[quote]变态比赛规则
为了促进各部门员工的交流,百度举办了一场全公司范围内的“拳皇”(百度内部最流行的格斗游戏)友谊赛,负责组织这场比赛的是百度的超级“拳皇”迷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吧。[/quote]
[code]
package com.maodajun.javaeye1;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class BaiDuQuest {
public String teamAndImpossable(int peoples,int impossable){
int maximpossable= maxImpossable(peoples);
maximpossable -=impossable;
List list =selfTeam(peoples,maximpossable,new ArrayList());
if(list!=null){
return "YES";
}
return "NO";
}
//递归算出最大可能。。。循环赛制
public int maxImpossable(int poples){
if(poples==2){
return 1;
}else if(poples<1){
return 0;
}
poples--;
return maxImpossable(poples)+poples;
}
public int maxFirstTeam(int peoples, int maximpossable){
int tmp = 0 ;
if(maxImpossable(peoples)<maximpossable){
return -1;
}
for(int i = peoples ; i >1 ; i--){
tmp = maxImpossable(i);
if(tmp <= maximpossable){
return i;
}
}
return tmp;
}
public List selfTeam(int peoples , int maximpossable ,List list ){
int max = maxFirstTeam(peoples,maximpossable);
if(max==0){
return list;
}else if (max==-1){
return null;
}else{
list .add(""+max);
return selfTeam(peoples-max,maximpossable-maxImpossable(max),list);
}
}
public static void main(String[] arg){
BaiDuQuest quest = new BaiDuQuest();
int people = 5;
for(int i = quest.maxImpossable(people) ; i >=0; i--){
List list =quest.selfTeam(people,i,new ArrayList());
int count = 0 ;
if(list!=null){
for(int j = 0 ; j < list.size(); j ++){
count +=Integer.parseInt(list.get(j).toString());
}
list.add(""+(people-count));
}
System.out.println(quest.maxImpossable(people)-i+":"+list);
}
}
}
[/code]
作过的看看能不能再快一点
主题贴子在这里。。。。
http://www.iteye.com/post/307049
[quote]变态比赛规则
为了促进各部门员工的交流,百度举办了一场全公司范围内的“拳皇”(百度内部最流行的格斗游戏)友谊赛,负责组织这场比赛的是百度的超级“拳皇”迷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吧。[/quote]
[code]
package com.maodajun.javaeye1;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class BaiDuQuest {
public String teamAndImpossable(int peoples,int impossable){
int maximpossable= maxImpossable(peoples);
maximpossable -=impossable;
List list =selfTeam(peoples,maximpossable,new ArrayList());
if(list!=null){
return "YES";
}
return "NO";
}
//递归算出最大可能。。。循环赛制
public int maxImpossable(int poples){
if(poples==2){
return 1;
}else if(poples<1){
return 0;
}
poples--;
return maxImpossable(poples)+poples;
}
public int maxFirstTeam(int peoples, int maximpossable){
int tmp = 0 ;
if(maxImpossable(peoples)<maximpossable){
return -1;
}
for(int i = peoples ; i >1 ; i--){
tmp = maxImpossable(i);
if(tmp <= maximpossable){
return i;
}
}
return tmp;
}
public List selfTeam(int peoples , int maximpossable ,List list ){
int max = maxFirstTeam(peoples,maximpossable);
if(max==0){
return list;
}else if (max==-1){
return null;
}else{
list .add(""+max);
return selfTeam(peoples-max,maximpossable-maxImpossable(max),list);
}
}
public static void main(String[] arg){
BaiDuQuest quest = new BaiDuQuest();
int people = 5;
for(int i = quest.maxImpossable(people) ; i >=0; i--){
List list =quest.selfTeam(people,i,new ArrayList());
int count = 0 ;
if(list!=null){
for(int j = 0 ; j < list.size(); j ++){
count +=Integer.parseInt(list.get(j).toString());
}
list.add(""+(people-count));
}
System.out.println(quest.maxImpossable(people)-i+":"+list);
}
}
}
[/code]