APCS練習-線段覆蓋長度

2016/3 APCS實作第三題

ZeroJudgeB966題目連結

題目說明

給定一維座標上一些線段,求這些線段所覆蓋的長度,注意,重疊的部分只能算一次。
例如給定 4 個線段:(5, 6)、(1, 2)、(4, 8)、(7, 9),如下圖,線段覆蓋長度為 6 。

輸入說明

1
2
3
4
5
第一列是一個正整數 N ,表示此測資有 N 個線段。
接著的 N 列每一列是一個線段的開始端點座標整數值 L 和結束端點座標整數值 R ,開始端點座標值小於等於結束端點座標值,兩者之間以一個空格區隔。
其中 30%的測資滿足, N < 100 , 0 ≤ L , R < 1000 ,並且線段沒有重疊。
其中 70%的測資滿足, N < 100 , 0 ≤ L , R < 1000 ,並且線段可能重疊。
其中100%的測資滿足, N < 10000 , 0 ≤ L , R < 10000000 ,並且線段可能重疊。

輸出說明

1
2
輸出其總覆蓋的長度。
本題為**嚴格比對**,請務必按照說明進行輸出。

範例測資

輸入:

1
2
3
4
5
6
5
160 180
150 200
280 300
300 330
190 210

輸出:

1
110

Code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
/*
110
*/
bool ifIn(int begin,int end,int test){
return (test>=begin&&test<end);
}

int main() {
int N,L,R,min,max;
scanf("%d",&N);
vector<vector<int>> A;
vector<int> result;

//input
for(int i=0;i<N;i++){
scanf("%d %d", &L, &R);
if(i==0){
min=L;
max=R;
}else{
if(L<min){
min=L;
}
if(R>max){
max=R;
}
}
A.push_back({L,R});
}


//action
//i:現在X,j:現在的N
for(int i=min;i<max;i++){
for(int j=0;j<N;j++){
if(ifIn(A[j][0],A[j][1],i)){
result.push_back(i);
break;
}
}
}
printf("%d", result.size());
}

ZeroJudge結果

Score:70%
有部分TLE,其餘AC

作者

飛翔 Sianglife

發表於

2022-10-19

更新於

2023-06-21

許可協議

評論