由題目的範例為舉例
{5,6} {1,2} {4,8} {7,9}
分別儲存他們的起點及終點(我自己是用hashmap)
並把所有起點放入一個陣列
陣列應該會有{5,1,4,7}
先將其進行排序
變成{1,4,5,7}
開始用for 掃描這個陣列一遍
先搞兩個變量 Start 以及End 初始值皆為-1
第一個為 1 終點為2
因為是第一條線將 Start變為1 End 變為2
第二個為 4 終點為8
檢查4是否大於End(也就是上個線段的終點)
如果大於 可以確定上個線段沒有重疊 將Start 跟 End 結算 answer+= End - Start
將4的起點及終點換上去
如果是小於 End 則可以知道 跟上個線段重疊
開始檢查終點是否大於 End 如果大於 則將End 變為其終點
小於則 可以知道這個線段被蓋住 所以甚麼都不改
接下來處理方式同理
Code :
package zerojudge.apcs;
import java.util.Collections;
import java.util.HashMap;
import java.util.Scanner;
import java.util.ArrayList;
public class b966 {
public static void main(String[]args){
Scanner input = new Scanner(System.in);
while (input.hasNextInt()){
int n= input.nextInt();
int ans=0;
HashMap<Integer,Integer> S = new HashMap<>();
ArrayList<Integer> n2 = new ArrayList<>();
for (int i =0;i<n;i++){
int a = input.nextInt();
int b = input.nextInt();
if (S.containsKey(a)){
if (b>S.get(a)){
S.put(a,b);
}
} else{
S.put(a,b);
n2.add(a);
}
}
Collections.sort(n2);
int End =-1;
int Start=-1;
for (int i =0;i<n2.size();i++){
if (n2.get(i)>End){
ans+=End-Start;
Start=n2.get(i);
End= S.get(n2.get(i));
} else{
if (S.get(n2.get(i))>End){
End=S.get(n2.get(i));
}
}
}
ans += End- Start;
System.out.println(ans);
}
}
}