1. 程式人生 > 其它 >LeetCode:圈地運動,求構成最小面積所需要的邊數

LeetCode:圈地運動,求構成最小面積所需要的邊數

技術標籤:LeetCodeleetcode

* 圈地運動,就是用很多木棍擺在地上組成一個面積大於0的多邊形~小明喜歡圈地運動,於是他需要去小紅店裡面買一些木棍,
 * 期望圈出一地來.小紅想挑戰一下小明,所以給小明設定了一些障礙.障礙分別是:
 * 1.如果小明要買第i塊木棍的話,他就必須把前I塊木棍都買下來.
 * 2.買了的木棍都必須用在圈地執行中.
 * 那麼請問小明最少買多少根木棍,才能使得木棍圍成的圖形是個面積大於0多邊形呢?
 *
 * 輸入描述:第一行一個數n,表示木棍個數.
 * 第二行n個數,第i個數表示第i個木棍的長度ai.
 * 1<=n<=10000
 * 1<=ai<=10000
 * 輸出描述:輸出一個數,表示最少需要的木棍個數,如果無解則輸出為-1.
 *
 * 解題思路:
 * 至少需要3根木棍才能構成封閉的圖形.而且從三角形的思路出發,任意兩邊之和必須大於第三邊.
 * 則多邊形前n個之和不包含最大值大於其最大值.
package movementOfEnclosure;

import java.util.Scanner;

public class Solution {
    public int enclosureMovement(){
        Scanner in=new Scanner(System.in);
        int n=in.nextInt();
        int[] nums=new int[n];
        for(int i=0;i<n;i++){
            nums[i]=in.nextInt();
        }
        if(nums.length<3) return -1;

        //條件:n-1邊的和必須大於最長邊,就能組成封閉圖形
        int sum=0,max=Integer.MIN_VALUE;//sum表示前n個數之和,max前n個數中的最大值
        int ans=-1;//標記是否能構成最小面積
        for(int i=0;i<nums.length;i++){
            sum+=nums[i];
            max=max>nums[i]?max:nums[i];
            //如果i大於1(如果不大於1,說明只有兩條邊,無論如何也構不成),並且sum-max>max,即
            //前n個數中不含max值之和大於max,則存在
            if(i>1&&sum>2*max){
                ans=i+1;//存在,則跳出
                break;
            }
        }
        return ans;
    }

    public static void main(String[] args){
        Solution so=new Solution();
        System.out.println(so.enclosureMovement());
    }
}