我要拿offer练习(第二天)

  • 题目描述

圈地运动,就是用很多木棍摆在地上组成一个面积大于0的多边形。小明喜欢圈地运动,于是他需要去小红店里买一些木棍,期望全出一块地来。小红想挑战一下小明,所以给小明设置了一些障碍。障碍分别是:

1)如果小明要买第i块木棍的话,他就必须把前i-1块木棍都买下来;
2)买了的木棍都必须用在圈地运动中。

那么请问小明最少买多少根木棍,才能使得木棍围成的图形是个面积大于0的多边形呢?

输入
第一行一个数n,表示木棍个数,第二行n个数,第i个数表示第i个木棍的长度ai,i<=n<=10000,1<=ai<=10000。

输出
输出一个数,表示最少需要的木棍个数,如果无解输出-1

样例输入
3

6 8 10

样例输出
3

说一下我个人的思路,当然不是最好的,在码代码的时候也是,需要什么去补什么。
这道题说的挺绕,但主要还是在于拔开迷雾,找到解题的关键。
这道题的具体意思是,小红来提供木棍(就是我们录入数组的数据,也就是多边形的边长),买到的木棍不能退货,所以关键就是按顺序使用最少的木棍来组成多边形,也就是说从3根开始,如过不够就再拿一根,直到没有木棍了就返回一个-1。

至于如何判断能否组成多边形的条件就是 n边中最大的边要小于剩下爱的n-1边的和。

package homeworks;

import java.util.Scanner;

public class Test04 {

static int sign = 0;//最大值的下标,方便使用最大值
static int count = 3;//需要的遍数

public static void main(String[] args) {
	Scanner sc = new Scanner(System.in);
	int a = sc.nextInt();//录入需要木棍的个数
	if (a <= 2) {//两根肯定没法组成多边形,直接输出个-1
		System.out.println(-1);
		System.exit(0);//中断虚拟机,让剩下的代码不执行
	}

	int[] all = new int[a];//用一个数组来存储这些木棍

	for (int i = 0; i < all.length; i++) {
		all[i] = sc.nextInt();//简单的循环录入
	}
	
	
	//写个死循环,在这里面如果达到条件了就break一下。
	
	
	while (true) {
		
		int[] newint = new int[count];
		for (int i = 0; i < count; i++) {
			newint[i] = all[i];//将需要的n个边赋值到新的数组里,组成n个边的数组,从这个里面来判断是否能组成多边形
		}

		int max = getMax(newint);//从这个数组中获得最大值
		if (jug(newint, max)) {
			System.out.println(count);//如果符合条件就返回数量,结束循环
			break;
		}
		
		if(newint.length == all.length) {//当新的数组的长度和原来数组的长度相同时,即所有的木棍都买完了
			System.out.println(-1);//还是么组成,输出-1
			break;//循环结束
		}

	}

}

private static boolean jug(int[] newint, int max) {
	// TODO Auto-generated method stub
	int sum = 0;
	for(int i = 0; i < newint.length; i++) {
		sum += newint[i];
	}
	
	sum = sum - newint[sign];//通过获取最大值的方法里面记录的索引来获取最大值,所有边长的和减去最大值就是剩下的边长的和
	
	if(sum > max) {
		return true;
	}else {
		count ++;
		return false;
	}
}

private static int getMax(int[] newint) {
	// TODO Auto-generated method stub
	int max = newint[0];
	for (int i = 0; i < newint.length; i++) {
		if (max < newint[i]) {
			max = newint[i];//得到最大值返回
			sign = i;//把最大值的索引记录一下
		}
	}

	return max;
}

}

总体来讲还是有些难度的,刚开始没有搞明白这道题什么意思,感觉自己有点笨,不过代码一次过还是挺开心的,坚持,希望今年年前能找到一份不错的工作!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值