1. 程式人生 > >CCF-買菜-Python(100分)

CCF-買菜-Python(100分)

試題編號: 201809-2
試題名稱: 買菜
時間限制: 1.0s
記憶體限制: 256.0MB
問題描述:
  小H和小W來到了一條街上,兩人分開買菜,他們買菜的過程可以描述為,去店裡買一些菜然後去旁邊的一個廣場把菜裝上車,兩人都要買n種菜,所以也都要裝n次車。具體的,對於小H來說有n個不相交的時間段[a1,b1],[a2,b2]…[an,bn]在裝車,對於小W來說有n個不相交的時間段[c1,d1],[c2,d2]…[cn,dn]在裝車。其中,一個時間段[s, t]表示的是從時刻s到時刻t這段時間,時長為t-s。
  由於他們是好朋友,他們都在廣場上裝車的時候會聊天,他們想知道他們可以聊多長時間。
輸入格式
  輸入的第一行包含一個正整數n,表示時間段的數量。
  接下來n行每行兩個數ai,bi,描述小H的各個裝車的時間段。
  接下來n行每行兩個數ci,di,描述小W的各個裝車的時間段。
輸出格式
  輸出一行,一個正整數,表示兩人可以聊多長時間。
樣例輸入
4
1 3
5 6
9 13
14 15
2 4
5 7
10 11
13 14
樣例輸出
3
資料規模和約定
  對於所有的評測用例,1 ≤ n ≤ 2000, ai < bi < ai+1,ci < di < ci+1,對於所有的i(1 ≤ i ≤ n)有,1 ≤ ai, bi, ci, di ≤ 1000000。

Python程式碼如下:

# 買菜
# 暴力搜尋,執行超時 60分
n = int(input())
a =[]     #小H的各個裝車的時間段
for i in range(n):
    a.append(list(map(int,input().split())))
b=[]      #小W的各個裝車的時間段
for i in range(n):
    b.append(list(map(int,input().split())))

k = 0
for i in range(n):
    for x in range(n):
        for j in range(b[x][0],b[x][1]):
            if j in range(a[i][0],a[i][1]):
                k += 1
print(k)

本題資料規模很大,如果用暴力搜尋,就會執行超時。
很多ACM題也是這樣,資料規模很大,要使用時間複雜度小的演算法,所以將演算法改進如下:

改進Python程式碼如下:

n = int(input())
H =[]     #小H的各個裝車的時間段
for i in range(n):
    H.append(list(map(int,input().split())))
W=[]      #小W的各個裝車的時間段
for i in range(n):
    W.append(list(map(int,input().split())))

m = max(H[n-1][1],W[n-1][1])-1
flag = [0 for x in range(m)]  # 表示時間段
for i in range(n):
    for j in range(H[i][0],H[i][1]):
        flag[j-1] += 1
for i in range(n):
    for j in range(W[i][0],W[i][1]):
        flag[j-1] += 1
        
print(flag.count(2))  #小H和小W都在的時段個數