目录
1 题目描述
有一个由很多木棒构成的集合,每个木棒有对应的长度,请问能否用集合中的这些木棒以某个顺序首尾相连构成一个面积大于 0 的简单多边形且所有木棒都要用上,简单多边形即不会自交的多边形。
初始集合是空的,有两种操作,要么给集合添加一个长度为 L 的木棒,要么删去集合中已经有的某个木棒。每次操作结束后你都需要告知是否能用集合中的这些木棒构成一个简单多边形
2 解题思路
用一个函数来判断一组值(若每行第一个数是1,可以将,第二个数放入ArrayList集合中,同理数为2时,删除相同长度的木棒),注意要对这组值当中的每一个数都要进行判断:其他数之和是否大于该数。
3 代码实现
import java.util.*;
public class Main {
public static boolean isOk(List<Long> data){
//算出data的总长度
int len = data.size();
//此循环判断是否任意len-1条边之和大于剩余一条边
for (int i = 0; i < len; i++) {
//取出data中的一个数
long temp = data.remove(i);
int sum = 0;
//将剩余的数字全部相加
for (int j = 0; j < len - 1; j++) {
sum += data.get(j);
}
//判断若剩余数字之和小于data中的某一值,返回false
if (sum <= temp) {
//将临时变量加回去,这一步也可不加,都判断出来不满足构成多边形的条件了
data.add(i, temp);
return false;
}
//将临时变量加回去,再进行下一步的判定
data.add(i, temp);
}
return true;
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
//此处注意!!!若用Integer,会报数组越界等异常
List<Long> data = new ArrayList<>();
int n = sc.nextInt();
for (int i = 0; i < n; i++) {
int a = sc.nextInt();
long b = sc.nextInt();
if (a == 1){
data.add(b);
}else {
data.remove(b);
}
if (isOk(data)){
System.out.println("Yes");
}else {
System.out.println("No");
}
}
}
}