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
輸出:
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;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; 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}); } 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