2020 8 8網易演算法崗筆試覆盤

2021-10-08 22:57:35 字數 3747 閱讀 2723

數學題dp題

現在有n個物品,每個物品都有乙個價值,現在想將這些物品分給兩個人,要求這兩個人分到的物品價值總和相同(個數可以不同,總價值相同即可),剩下的物品就要扔掉,現在想知道最少需要扔多少價值的物品才能滿足要求分給兩個人。

暴力法,時間複雜度為o(3

n)

o(3^n)

o(3n

)

import sys

if __name__ ==

"__main__"

: n =

int(sys.stdin.readline(

).strip())

# 讀取每一行

line = sys.stdin.readline(

).strip(

)# 把每一行的數字分隔後轉化成int列表

data =

list

(map

(int

, line.split())

) res = sys.maxsize

defdfs(idx, a, b, drop)

:global res

if idx ==

len(data)

:if a == b:

res =

min(res, drop)

return

dfs(idx+

1, a+data[idx]

, b, drop)

dfs(idx+

1, a, b+data[idx]

, drop)

dfs(idx+

1, a, b, drop+data[idx]

) dfs(0,

0,0,

0)print

(res)

dp法,時間複雜度為o(n

∗tot

al

)o(n*total)

o(n∗to

tal)

,t ot

al

total

tota

l是所有物品價值之和

import sys

if __name__ ==

"__main__"

: n =

int(sys.stdin.readline(

).strip())

# 讀取每一行

line = sys.stdin.readline(

).strip(

)# 把每一行的數字分隔後轉化成int列表

data =

list

(map

(int

, line.split())

) total =

sum(data)

dp =[0

]*(total+1)

dp[0]

=1for i in

range

(n):

for j in

range

(total, data[i]-1

,-1)

: dp[j]

= dp[j]

| dp[j-data[i]

] res = total

for i in

range

(total,-1

,-1)

:if i %2!=

0:continue

if dp[i]

and dp[i//2]

: res = total-i

break

print

(res)

n個教授討論學術成果,如果教授i

ii認可教授j

jj,教授j

jj認可教授k

kk,那麼可以認為教授i

ii認可教授k

kk。教授可以自己認可自己的學術成果。

圖論之有向圖尋找強連通分量,強連通分量指的是結點可以互相到達的子圖。使用tarjan演算法,時間複雜度為o(v

+e

)o(v+e)

o(v+e)

,v

vv表示結點個數,e

ee表示有向邊個數。

from collections import defaultdict

deftarjan

(node)

:global dfn, low, time, stack, res

dfn[node]

= low[node]

= time

time +=

1for adj_node in graph[node]

:if dfn[adj_node]==0

: tarjan(adj_node)

low[node]

=min

(low[node]

, low[adj_node]

)elif adj_node in stack:

low[node]

=min

(low[node]

, low[adj_node]

) count =

0if dfn[node]

== low[node]

:while stack:

tmp = stack.pop(

) count +=

1if tmp == node:

break

if count >1:

res +=

int(

(count*

(count-1)

)/2)

if __name__ ==

"__main__"

:# 讀取每一行

line = sys.stdin.readline(

).strip(

)# 把每一行的數字分隔後轉化成int列表

nm =

list

(map

(int

, line.split())

) n, m = nm[0]

, nm[1]

# 構建圖

time =

1 dfn =[0

]*(n+1

) low =[0

]*(n+1

) stack =

graph = defaultdict(

list

)for i in

range

(m):

# 讀取每一行

line = sys.stdin.readline(

).strip(

)# 把每一行的數字分隔後轉化成int列表

xy =

list

(map

(int

, line.split())

)if xy[0]

== xy[1]

:continue

graph[xy[0]

]1])

res =

0for node in

range(1

, n+1)

:if dfn[node]==0

: tarjan(node)

print

(res)

2020 08 08網易筆試

注釋部分 超時了,優化後如下 def test1 n int input arr list map int input strip split n res 0for i in range n res countprime arr i return res defcountprime n if n 2...

2012網易筆試題

1 24小時內,表的時針 分針 秒針完全重合多少次?分別是什麼時刻。2 100萬條記錄,可以通過權值比較大小,選取權值最大的前100條記錄,並有序排列後輸出 3 鏈式資料結構,檢測是否有環 4 用反射建立classa的例項和classa陣列的例項 5 聯合索引的問題。問select語句如何寫,才能用...

2012 10 10網易筆試題

一.用位運算實現加法 int add int a,int b 二.確定cpu的大小端方式 筆試的時候此題做錯了,竟用移位去做.對於此操作,移位不起作用.int main 三.圖的深度遍歷 筆試的時候沒有寫出來,寫出思路為利用棧乙個個結點壓入.直到棧頂那個結點無指向子鏈結或連線已遍歷過或指向的鏈結的結...