1. 線段覆蓋長度
    1. 題目
    2. 解題

線段覆蓋長度

線段覆蓋長度

APCS歷屆

題目

來看看題目吧:
pic
簡單來說就是變一排,然後看總共包到了幾個格子。

解題

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
def merge():
global list2
list2.append(list1[0])
for i in range(1, len(list1)):
first = list1[i]
last = list2[-1]
if first[0] <= last[1]:
last[1] = max(last[1], first[1])
else:
list2.append(first)

list1 = []
n = int(input())
#list1 = [[160, 180], [150, 200], [280, 300], [300, 330], [190, 210]] # - >[[150, 200], [160, 180], [190, 210], [280, 300], [300, 330]]
for i in range(n):
#a, b = list1[i][0], list1[i][1]
list1.append(list(map(int, input().split())))
list1.sort(key = lambda x:x[0])
#print(list1)
list2 = []
merge()
ans = 0
for i in range(len(list2)):
ans += list2[i][1] - list2[i][0]
print(ans)

我的解法呢就是先將他們的第零位的東西都排序,然後將他們合併,怎麼合併呢?我們先用list2當暫存,接著我們把list1的第一個值存進去,然後依序算出list1的第i個值和list2的最後一個如果他的第零個<= 他的最後一個,那麼我們就判斷哪一個的最後一個比較大,意思就…要合併要先看頭有沒有對到,啊如果不符合我們就list2加上first(list1[i])。