CCF-買菜-Python(100分)
阿新 • • 發佈:2018-12-27
試題編號: 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都在的時段個數