有一個由很多木棒構成的集合,每個木棒有對應的長度,請問能否用集合中的這些木棒以某個順序首尾相連構成一個面積大於 0 的簡單多邊形且所有木棒都要用上,簡單多邊形即不會自交的多邊形。 初始集合是空的,有兩種操作,要麼給集合添加一個長度爲 L 的木棒,要麼刪去集合中已經有的某個木棒。每次操作結束後你都需要告知是否能用集合中的這些木棒構成一個簡單多邊形。
輸入描述:
每組測試用例僅包含一組數據,每組數據第一行爲一個正整數 n 表示操作的數量(1 ≤ n ≤ 50000) , 接下來有n行,每行第一個整數爲操作類型 i (i ∈ {1,2}),第二個整數爲一個長度 L(1 ≤ L ≤ 1,000,000,000)。如果 i=1 代表在集合內插入一個長度爲 L 的木棒,如果 i=2 代表刪去在集合內的一根長度爲 L 的木棒。輸入數據保證刪除時集合中必定存在長度爲 L 的木棒,且任意操作後集合都是非空的。
輸出描述:
對於每一次操作結束有一次輸出,如果集合內的木棒可以構成簡單多邊形,輸出 “Yes” ,否則輸出 “No”。
輸入例子:
5
1 1
1 1
1 1
2 1
1 2
輸出例子:
No
No
Yes
No
No
程序:
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException {
// list集合用來存放長度爲L的木棒;
List<Integer> list = new ArrayList<Integer>();
// 聲明鍵盤輸入流
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String buffer = null;
int n = 0;
int firstNum = 0;
int secondNum = 0;
while ((buffer = br.readLine()) != null) {
// n=0表示這次讀取的數據是行數
if (n == 0) { // counter用來記錄讀取幾行數據
counter = Integer.parseInt(buffer);
n = 1;
continue;
}
// 每次循環對n+1,n=counter+1時表示數據已讀取完畢,可以退出循環
if (n == counter + 1)
break;
// firstNum表示輸入數據的第一位
firstNum = Integer.parseInt(String.valueOf(buffer.charAt(0)));
// secondNum表示輸入數據的第二位
secondNum = Integer.parseInt(String.valueOf(buffer.charAt(1)));
// 第一位數據爲1時,將棒的長度添加進集合
list.add(secondNum);
// 棒的數量小於3,不能能構成簡單多邊形
if (list.size() < 3)
System.out.println("NO");
else {
int sum = 0;
// 對集合記性從小到大的排序
Collections.sort(list);
// 計算出除最大值之外的其他棒的長度的和
for (int i = 0; i < list.size() - 1; i++) {
sum += list.get(i);
}
// 最大邊的長度小於其他邊的和時可以構成多邊形,反之不能
if (sum > list.get(list.size() - 1))
System.out.println("Yes");
else
System.out.println("NO");
}
}
// 第一位爲2時,注意不能使集合長度爲0,即當只有一個棒時,不能再刪除數據
if (firstNum == 2) {
if (list.size() == 2) {
list.remove(list.size() - 1);
System.out.println("NO");
}
list.remove(list.size() - 1);
int sum = 0;
Collections.sort(list);
for (int i = 0; i < list.size() - 1; i++) {
sum += list.get(i);
}
if (sum > list.get(list.size() - 1))
System.out.println("Yes");
else
System.out.println("NO");
}
}
}
br.close();
}