叠积木-od

文章讲述了在解决华为OD机的一道编程题目时,关于如何使用C++实现对积木进行有效组合,避免全排列,最终通过排序和双指针或递归方法确定层数的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目链接:【华为OD机试真题 C++】叠积木-优快云博客

1 3 3 1 1 3
输出:3


1 3 5
输出:0


2 3 5
输出:2

7 7 7 7
输出:4

解题思路:

最开始看错题,以为是尽量求层数最多的组合,那就是各种全排列都要考虑了,原来题目说明所有的积木都要用上。这就简单,先将所有积木从大到小排序,每层可以是1根也可以2根,那第一层就只有两种情况,第一根作底,第一加倒数最小作底。然后第二层一样,要么是第二根,要么就是第二根+倒数剩下最小那根。所以这个题就变成了类似双指针的问题,我是用递归来处理双指针,其实也可以直接while循环来处理

public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		while(sc.hasNext()) {
			String[] sa1 = sc.nextLine().split(" ");
			Integer[] nums = new Integer[sa1.length];
			for(int i=0; i< nums.length;i++) {
				nums[i] = Integer.valueOf(sa1[i]);
			}
			Arrays.sort(nums, (x,y) -> y-x);
			// 先用1根最大的积木作第一层
			int ok = solution(nums, 1, nums.length-1, nums[0], 1);
			if(ok ==0) { //表示起始拿一根最大的解决不了问题
				//用最大的+最小的作第一层
				ok = solution(nums, 1, nums.length-2, nums[0]+nums[nums.length-1], 1);
			}
			System.out.println(ok);
		}
	}
	public static int solution(Integer[] nums, int leftIndex, 
			int rightIndex, int preVal, int count){
		int isOK = 0;//0表示不成功的情况
		if(preVal == nums[leftIndex]) {//先尝试拿一根积木
			if(leftIndex == rightIndex) {
				return count+1;
			}
			return solution(nums, leftIndex+1, rightIndex, preVal, count+1);

		}else if(leftIndex<rightIndex && preVal == (nums[leftIndex]+nums[rightIndex])){ // 拿两根积木
			if(leftIndex == rightIndex-1) {
				return count+1;
			}
			// 用了两根积木,左右指针都需要递变
			return solution(nums, leftIndex+1, rightIndex-1, preVal, count+1);
		}
	
		return isOK;
	}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值