乔治棍子算法JAVA实现


乔治拿来一组等长的木棒,将它们随机地裁断,使得每一节木棍的长度都不超过50个长度单位。

然后他又想把这些木棍恢复到为裁截前的状态,但忘记了初始时有多少木棒以及木棒的初始长度。

请你设计一个程序,帮助乔治计算木棒的可能最小长度。每一节木棍的长度都用大于零的整数表示。

package algorithm;

public class stickTest {


	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int stickSplit[]={5,2,1};
		//获取棍子2分次数
		int splitcount=stickSplit.length/2;
		if(stickSplit.length%2!=0){
			splitcount++;
		}
		//数组默认-1;
		splitcount=splitcount-1;
		//排序
		stickTest.sort(stickSplit);
		//求和
		int sum=arraySum(stickSplit);
		System.out.println("总长度为"+sum);
		//定义棍子长度默认为0
		int stickMinLength=stickSplit.length;
		//默认棍子的最小长度为sum/stickSplit.length如果
		if(stickSplit[0]>sum/stickSplit.length){
			stickMinLength=sum/stickSplit[0];
		}
			System.out.println("假设有"+stickMinLength+"根棍子");
			if(sum%stickMinLength==0){
				doa:do {
					System.out.println("能被整除则进行计算");
					System.out.println("假设当此棍子长度"+sum/stickMinLength);
					if(stickMinLength<=1){
						break doa;
					}
					//遍历校验
					boolean flaga=true;
					//定义模拟长度
					doaa:do{
						int stickDefineLength=sum/stickMinLength;
						int ia=0;
						int ib=stickSplit.length-1;
						if(sum%stickMinLength!=0){
							stickMinLength--;
							continue;
						}
						if(ia>=splitcount||ib<splitcount){
							System.out.println("最小长度为"+stickDefineLength);
							break doa;
						}
						//如果模拟长度小于最大长度则将模拟长度设为最大长度
						if(stickSplit[ia]>stickDefineLength){
							break doaa;
						}
						//如果发现模拟长度为棍子最大长度则向下继续拼接
						if(stickSplit[ia]==stickDefineLength){
							ia++;
							continue doaa;
						}
						//深度拼接 开始  和最小数组成是否等于定义长度
						boolean flagaa=true;
						int thisValue=stickSplit[ia]+stickSplit[ib];
						do{
							//发现拼接总和过大,则跳出
							if(thisValue>stickDefineLength){
								break doaa;
							}
							//如果拼接后发现相等则进行下次拼接
							if(thisValue==stickDefineLength){
								ia++;
								ib--;
								continue doaa;
							}
							//发现小,则继续加最小值
							if(thisValue<stickDefineLength){
								ib--;
								thisValue+=stickSplit[ib];
							}
						}while(flagaa);
					}while(flaga);
					stickMinLength--;
				} while (stickMinLength>1);
			}
			System.out.println("最小长度为"+stickMinLength);
			System.out.println("棍子长度为"+sum/stickMinLength);
	}
	//求和
	public static int arraySum(int[]arr){
		int sum=0;
		for(int i=0;i<arr.length;i++){
			sum+=arr[i];
			System.out.print(arr[i]);
		}
		return sum;
	}
	/**
	 * 较低效冒泡
	 * @param arr
	 */
	public static void sort(int[]arr){
	    for(int i=0;i<arr.length-1;i++){
	        for(int j=i+1;j<arr.length;j++){
	            if(arr[i]<arr[j]){
	              int temp=arr[i];
	              arr[i]=arr[j];
	              arr[j]=temp;
	            }
	        }
	    }
	}
}




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值