java语言实现木棒拼图-牛客网

本文介绍了一道编程题目,涉及使用Java语言解决木棒拼图问题,目标是判断给定长度的木棒是否能构成面积大于0的简单多边形。文章分为题目描述、解题思路和代码实现三个部分。解题思路是通过一个函数来检查木棒集合,确保所有木棒首尾相连能构成不自交的多边形。
摘要由CSDN通过智能技术生成

目录

1 题目描述

 2 解题思路

3 代码实现


1 题目描述

链接:https://www.nowcoder.com/questionTerminal/8bbc9415216d47459c425b5e19164365?orderByHotValue=1&mutiTagIds=665&page=1&onlyReference=false
来源:牛客网

有一个由很多木棒构成的集合,每个木棒有对应的长度,请问能否用集合中的这些木棒以某个顺序首尾相连构成一个面积大于 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");
            }
        }
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值