- 题目描述
圈地运动,就是用很多木棍摆在地上组成一个面积大于0的多边形。小明喜欢圈地运动,于是他需要去小红店里买一些木棍,期望全出一块地来。小红想挑战一下小明,所以给小明设置了一些障碍。障碍分别是:
1)如果小明要买第i块木棍的话,他就必须把前i-1块木棍都买下来;
2)买了的木棍都必须用在圈地运动中。那么请问小明最少买多少根木棍,才能使得木棍围成的图形是个面积大于0的多边形呢?
输入
第一行一个数n,表示木棍个数,第二行n个数,第i个数表示第i个木棍的长度ai,i<=n<=10000,1<=ai<=10000。输出
输出一个数,表示最少需要的木棍个数,如果无解输出-1。样例输入
36 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;
}
}
总体来讲还是有些难度的,刚开始没有搞明白这道题什么意思,感觉自己有点笨,不过代码一次过还是挺开心的,坚持,希望今年年前能找到一份不错的工作!