這是自己寫的第乙個程式,前幾天幫忙做筆試,什麼都不會,用一次次加一迭代完成,結果超時,這幾天學習了一下資料結構,感覺很有收穫,又嘗試著寫一寫這個程式,忙活一下午才完成,不過還是很有成就感的,時間對比如下:
1000000 1000000
old:127928448,time:12.6369 new:127928448,time=0.0000
10000000000 10000000000
new:20478570792960,time=0.0001
可見時間複雜度優化還是henm很明顯的哈哈!
問題:乙個等式x+y=x|y(或運算),給出乙個正整數x,滿足等式的正整數y有很多個,從第乙個開始由小到大數y,給定乙個正整數k求第k個y。
輸入樣例:共t組測試用例
tx1 k1
x2 k2
要求:2s內完成所有測試用例
實現如下:python3.6
import time
def tobin(a):
return bin(int(a))[2:][::-1]
def tonode(a):
if a=='0':
return [0,1,2]
else:
return [0,0,1]
def __init__(data_bin):
size=
node=
multi=
if data_bin[0]=='0':
else:
return size,node,multi
def twosearch(seq,size,i,node):
result='1'
i-=1
key=seq
while i>=0:
if size[i]==0:
result+='0'
i-=1
else:
if key>size[i]:
result+='1'
key-=size[i]
else:
result+='0'
i-=1
return int(result,2)
def fun_new(x,k):
i=1data_bin=tobin(x)
data_len=len(data_bin)
size,node,multi=__init__(data_bin)
k=int(k)
if sum(size)>=k:
return 1
while 1:
if i=k:
break
else:
i+=1
seq=k-sum(size[:-1])
result=twosearch(seq,size,i,node)
return result
def fun_old(x,k):
k=int(k)#input
x=int(x)#input
y=0for i in range(k):
y+=1
while x|y!=x+y:
y+=1
return y
if __name__ == '__main__':
t = int(input())
for i in range(t):
x,k = input().split()
# start_old = time.clock()
# result_old=fun_old(x,k)
# end_old=time.clock()
start_new = time.clock()
result_new=fun_new(x,k)
end_new=time.clock()
#print("old:%d,time:%.4f new:%d,time=%.4f" %(result_old,end_old-start_old,result_new,end_new-start_new))
print("new:%d,time=%.4f" %(result_new,end_new-start_new))
1105 第K大的數 二分搜尋
1105 第k大的數 基準時間限制 1 秒 空間限制 131072 kb 分值 40 難度 4級演算法題 陣列a和陣列b,裡面都有n個整數。陣列c共有n 2個整數,分別是a 0 b 0 a 0 b 1 a 1 b 0 a 1 b 1 a n 1 b n 1 陣列a同陣列b的組合 求陣列c中第k大的數...
1105 第K大的數 二分
1105 第k大的數 基準時間限制 1 秒 空間限制 131072 kb 分值 40 難度 4級演算法題 陣列a和陣列b,裡面都有n個整數。陣列c共有n 2個整數,分別是a 0 b 0 a 0 b 1 a 1 b 0 a 1 b 1 a n 1 b n 1 陣列a同陣列b的組合 求陣列c中第k大的數...
1105 第K大的數 思維,二分)
陣列a和陣列b,裡面都有n個整數。陣列c共有n 2個整數,分別是 a 0 b 0 a 0 b 1 a 0 b n 1 a 1 b 0 a 1 b 1 a 1 b n 1 a n 1 b 0 a n 1 b 1 a n 1 b n 1 是陣列a同陣列b的組合,求陣列c中第k大的數。例如 a 1 2 3...