刷題日記 網易 豐收

2021-09-25 19:47:53 字數 2282 閱讀 2368

又到了豐收的季節,恰逢小易去牛牛的果園裡遊玩。

牛牛常說他對整個果園的每個地方都瞭如指掌,小易不太相信,所以他想考考牛牛。

在果園裡有n堆蘋果,每堆蘋果的數量為ai,小易希望知道從左往右數第x個蘋果是屬於哪一堆的。

牛牛覺得這個問題太簡單,所以希望你來替他回答。

輸入描述:

第一行乙個數n(1 <= n <= 105)。

第二行n個數ai(1 <= ai <= 1000),表示從左往右數第i堆有多少蘋果

第三行乙個數m(1 <= m <= 105),表示有m次詢問。

第四行m個數qi,表示小易希望知道第qi個蘋果屬於哪一堆。

輸出描述:

m行,第i行輸出第qi個蘋果屬於哪一堆。

輸入例子1:

5

2 7 3 4 9

31 25 11

輸出例子1:

153

傻乎乎的又寫了兩層迴圈。。。

import sys 

n = sys.stdin.readline(

).split(

)n =

int(n[0]

)).split(

)#每一堆有多少個蘋果

list

(map

(int

)query_times = sys.stdin.readline(

).split(

)query_times =

int(query_times[0]

)# 詢問次數

query = sys.stdin.readline(

).split(

)query =

list

(map

(int

,query)

)# 詢問第幾個蘋果

for i in

range

(query_times):0

for j in

range

(n):

:print

(j+1

)break

結果: 還不如瞌睡呢

執行超時:您的程式未能在規定時間內執行結束,請檢查是否迴圈有錯或演算法複雜度過大。

case通過率為30.00%

所以感覺網易這些題,都需要至少比o(n

2)

o(n^2)

o(n2

)複雜度低

不是只找一次,已經有乙個o(n

)o(n)

o(n)

了,那麼查詢演算法應該是去寫二分查詢o(l

ogn)

o(logn)

o(logn

) 才能控制住複雜度的

對每對蘋果的數目做累加。可以得到乙個遞增陣列,然後利用二分查詢法查詢。

n =

int(

input()

)ns =

list

(map

(int

,input()

.split())

)m =

int(

input()

)q =

list

(map

(int

,input()

.split())

)# 累加蘋果堆得到遞增數列

for i in

range(1

,n):

ns[i]

+= ns[i-1]

# 注意這種操作是可以的。迴圈中不會每次算出新的ns[i]就覆蓋掉舊值

# 二分查詢

for item in q:

# 待查的值

l,r =

0,n-

1while l# 終止條件為兩指標相遇

mid =

(l+r)

>>

1# 移位速度快, l+r存在溢位風險

if ns[mid]

# 待查值在中間值的右邊

l = mid+

1# # 因為待查值不會處於中間值所對應的堆,所以+1

else

: r = mid # 待查值在中間值所在堆或者中間值左邊的堆,r最多只能移動到mid,還需要左指標輔助判斷

print

(r+1

)

網易測評題 豐收

又到了豐收的季節,恰逢小易去牛牛的果園裡遊玩。牛牛常說他對整個果園的每個地方都瞭如指掌,小易不太相信,所以他想考考牛牛。在果園裡有n堆蘋果,每堆蘋果的數量為ai,小易希望知道從左往右數第x個蘋果是屬於哪一堆的。牛牛覺得這個問題太簡單,所以希望你來替他回答。輸入描述 第一行乙個數n 1 n 105 第...

網易筆試 豐收

又到了豐收的季節,恰逢小易去牛牛的果園裡遊玩。牛牛常說他對整個果園的每個地方都瞭如指掌,小易不太相信,所以他想考考牛牛。在果園裡有n堆蘋果,每堆蘋果的數量為ai,小易希望知道從左往右數第x個蘋果是屬於哪一堆的。牛牛覺得這個問題太簡單,所以希望你來替他回答。輸入描述 第一行乙個數n 1 n 105 第...

刷題日記 網易 俄羅斯方塊

小易有乙個古老的遊戲機,上面有著經典的遊戲俄羅斯方塊。因為它比較古老,所以規則和一般的俄羅斯方塊不同。熒幕上一共有 n 列,每次都會有乙個 1 x 1 的方塊隨機落下,在同一列中,後落下的方塊會疊在先前的方塊之上,當一整行方塊都被佔滿時,這一行會被消去,並得到1分。有一天,小易又開了一局遊戲,當玩到...