#29960: JAVA AC 寫法 不用輸入優化 其他語言適用 以及Code


wer12369qaz15963@gmail.com (dentr)

學校 : 新北市立清水高中
編號 : 174903
來源 : [111.248.152.60]
最後登入時間 :
2022-07-26 15:13:49
b966. 3. 線段覆蓋長度 -- 2016年3月apcs | From: [219.84.98.239] | 發表日期 : 2022-04-16 16:40

由題目的範例為舉例

{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);
}
}
}
 
ZeroJudge Forum