"百度之星"程序设计大赛试题解答(Java实现)---变态的比赛规则(未完成!!!)

悲催啊,弄了整整一下午还是没有完整滴弄出来大哭大哭大哭

 
 

不得不承认我智商很一般,搞这个整数划分的算法搞了近1个小时才弄明白,可是,这道变态的题目并不是这样简单啊!!!

忍无可忍,只好站在前人的肩膀上了来做了

一位是这位大牛的:点击打开

一位是这位大牛的:点击打开

感谢二位,可惜我才疏学浅,还没独立弄出来!!!大哭

时间不早了,有时间再接着弄吧,先把代码贴出来,真心恳请各位大牛指点迷津。。。

1,建立bean类,存储 成员数和可能的比赛次数 

/**
 *Apr 2, 2013
 *Copyright(c)JackWang
 *All rights reserve
 *@Author <a href="mailto:[email protected]">JackWang</a>
*/
package com.example.baidupro;
/**
 *用于存储N 和 K值
 * @author WangCheng
 *
 */
public class InputData {
	private String N;
	private String K;
	public String getN() {
		return N;
	}
	public void setN(String n) {
		N = n;
	}
	public String getK() {
		return K;
	}
	public void setK(String k) {
		K = k;
	}
	/**
	 * @param n
	 * @param k
	 */
	public InputData(String n, String k) {
		super();
		N = n;
		K = k;
	}
	

}

2 业务代码:

/**
 *Apr 2, 2013
 *Copyright(c)JackWang
 *All rights reserve
 *@Author <a href="mailto:[email protected]">JackWang</a>
 */
package com.example.baidupro;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;


/**
 * 变态的比赛规则 为了促进各部门员工的交流,百度 (baidu) 举办了一场全公司范围内的 " 拳皇友谊赛 " ,
 * 负责组织这场比赛的是百度的超级" 拳皇 " 迷 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
 * 
 * @author WangCheng
 * 
 */

public class BoxingGamePro {

	private static List<InputData> input= new ArrayList<InputData>(); // 用于存储输入的组数,由于初始大小
	private static List<Integer> wayList = new ArrayList<Integer>();
	private static int K;
	private static boolean isFind = false;
	/**
	 * 所有异常全部抛出,暂时不做处理
	 * 
	 * @param args
	 * @throws IOException
	 */
	public static void main(String[] args) throws IOException {
		// 1,读取输入数据
		getInput();
		//2,判读
		computeAppropriate();
		
     		

	}
	public static void computeAppropriate() {
		//整数划分的思想,关键是要把每一种分组方法的比赛场数计算出来,因此必须把每一种分法放在一个链表里
		//
		Iterator<InputData> it = input.iterator();
		while (it.hasNext()) {
			InputData obj = it.next();
			String key = obj.getN();
			String value = obj.getK();
			K = Integer.parseInt(value);
//			System.out.println(key+":"+value);
			int N = Integer.parseInt(key);
			search(N,N);
			if (!isFind) {
				System.out.println("NO");
			}
			
		}
		
	}
	public static void search(int n, int n2) {
		if (n2==0) { //如果将全部人员放在一个组
			wayList.add(n);
			judge(wayList);
			wayList.clear();
		}
		
		if(n2==1){
			for(int i =0;i<n;i++){
				wayList.add(1);
			}
			
//			System.out.println(wayList);
			
			judge(wayList);
			wayList.clear();
		}else {
			for(int i = n2 ;i>1;i--){//     1+ f(n, m-1);                (n=m)
				if (isFind) {
					break;
				}
				if(n == n2){
					wayList.add(1);
					judge(wayList);
					wayList.clear();
				}else{
					wayList.add(i);
					search(n - i, (i < n - i) ? i : (n - i));  //这里挂了。。。。。
					wayList.clear();
					
				}
			}
		}
	}
	
	public static void judge(List<Integer> wayList2) {

		int value = 0;
		Integer[] in = new Integer[wayList2.size()];
				  in = (Integer[])wayList2.toArray(in);
		for (Integer integer : in) {
			System.out.print(integer+" ");
		}
		System.out.println();
		for(int i = 0;i<in.length;i++){
			if (in.length == 1) {
				value = 0;
				continue;
			}
			for(int j = i+1;j<in.length;j++){
				
				value += in[i]+in[j];
//				System.out.println(value);
			}
		}
		if (value == K) {
			System.out.println("YES");
			isFind = true;
		}
		
	}
	public static void getInput() throws IOException {
		System.out.println("请输入数据,数据对之间用空格区分(输入over结束输入!!!)...");
		// 不能确定,所以不能用二维数组,由于数据对之间存在着映射关系,所以用HashMap
		BufferedReader bufr = new BufferedReader(new InputStreamReader(
				System.in));
		String line = null;
		while ((line = bufr.readLine()) != null) {
			if ("over".equals(line)) {
				break;
			}
			// 1.1处理输入的数据格式
			String[] str = line.split(" +"); // 即使用户一次输入了多个空格也能处理;
			if (str.length != 2) {
				System.out.println("输入的数据有误,请重新输入!");
				System.exit(0);
			}

			input.add(new InputData(str[0], str[1]));
			

		}

	}
}

今晚10点钟上完课回来又忙活了一个多小时了,还是没有想出来!!! 大哭 发火

我想是我基础问题了!这个桃子可能我暂时跳起来还摘不到,那就先补充能量,有能力再摘吧!奋斗奋斗

从明天开始,转向基础!先把基础打牢再说吧!此问题留待以后解决!!!

也希望热心的盆友能给我指点指点!快哭了





   

你可能感兴趣的:(java,编程,百度之星,程序设计大赛)