演算法競賽入門經典第四章 部分習題解答

2021-07-11 16:01:51 字數 4903 閱讀 3958

習題4-2:此題不難,我採取最直接的辦法,暴力遍歷進行判斷,**如下:

def

do_squares

(h,v,n):

#h,v是乙個矩陣

deftest

(i,j,l):

_i = i;_j = j

while(_jif(h[_i][_j]==0):return

false

_j+=1

while(_iif(v[_i][_j]==0):return

false

_i+=1

while(_j>j):

if(h[_i][_j-1]==0):return

false

_j-=1

while(_i>i):

if(v[_i-1][_j]==0):return

false

_i-=1

return

true

count = [0]*(n-1)

for i in range(1,n-1):

for j in range(1,n-1):

for length in range(1,n-1):#長度從1-n-1

if(test(i,j,length)):count[length]+=1

for k in range(1,n-1):

if(count[k]!=0):print('number of suqare with length(%d) : %d'%(k,count[k]))

defsquares

(h,v,n):

h = [ [0]*(n+1) for i in range(n+1)]

v = [ [0]*(n+1) for j in range(n+1)]

for x in h:h[x[0]][x[1]] = 1

for y in v:v[y[0]][y[1]] = 1

do_squares(h,v,n+1)

squares([(1,1),(1,3),(2,1),(2,2),(2,3),(3,2),(4,2),(4,3)]

,[(1,1),(1,2),(2,2),(3,2),(2,3),(1,4),(2,4),(3,4)],4)

def cube(a,b):

x = [[a[0],a[5]],[a[1],a[4]],[a[2],a[3]]]

y = [[b[0],b[5]],[b[1],b[4]],[b[2],b[3]]]

for i in range(3):

x[i].sort();y[i].sort()

x.sort();y.sort()

print(x==y)

cube('grggrb','rggbgr')

def

convert

(x):

ans = ''

tmp = x.split('.')

for each in tmp:

tmp_ans = bin(int(each))[2:]

ans += '0'*(8-len(tmp_ans))+tmp_ans

return ans

defrecovert

(y):

ans = ''

for i in range(0,32,8):

ans += str(int(y[i:i+8],base = 2))+'.'

return ans[:-1]

defsolve

(ip):

net = convert(ip[0])

for each_ip in ip[1:]:

tmp = convert(each_ip)

for i in range(len(net)):

if(tmp[i]!=net[i]):net = net[:i];break

mask = '1'*len(net)+'0'*(32-len(net))

net += '0'*(32-len(net))

print('%s*********************%s'%(recovert(net),recovert(mask)))

solve(['194.85.160.183','194.85.160.177','194.85.160.178'])

def

do_raid

(d,s,b,type):

#b代表資料塊

check_result = 0

if type=='e'

else

1def

eor(x,check_pos):

ans = 0

count = 0

err_pos = 0

for i,each in enumerate(x):

if(each!='?'):ans ^= int(each,base = 2)

else:count+=1;err_pos = i

if(count>1):return

false,x

elif(count==1):

tmp = bin(ans^check_result)[2:]

x[err_pos] = '0'*(s-len(tmp))+tmp

return

true,x[0:check_pos]+x[check_pos+1:]#去掉校驗碼的部分

check_pos = 0

final_ans = ''

for i in range(0,len(b),d):

if(b[check_pos]=='?'):print('check illegal');return

test,tmp = eor(b[i:i+d],check_pos%d)

ifnot test:print('too many error');return

#磁碟資料損壞過多

check_pos += (d+1)

print(tmp)

final_ans += ''.join(tmp)

print(final_ans,hex(int(final_ans,2)))

do_raid(5,2,['00','01','10','11','?','01','10','11','10','?','01','11','01','10','?',

'11','10','?','11','01','11','11','11','00','11'],'e')

def

tired_students

(students):

n = len(students)

a = [students[i][0] for i in range(n)]

b = [students[i][1] for i in range(n)]

c = [students[i][2]-0.5

for i in range(n)]

print(a,b,c)

time = 1

sleeped = 0

initial_c = c[:]

tmp = [1]*n

for i in range(n):

if(c[i]>a[i]):sleeped += 1;tmp[i] = 0

print(sleeped,tmp)

while(sleeped !=0):

time += 1

tmp_sleeped = 0

for i,each in enumerate(c):#遍歷每乙個學生的情況

c[i] = (c[i]+1)%(a[i]+b[i])#獲取當前在週期裡面的位置

if(c[i]>a[i]):#到了睡覺時間

if(tmp[i] == 1):#上一刻處於聽課

if(2*sleeped > n):#滿足睡覺條件

tmp[i] = 0

tmp_sleeped += 1

else:

c[i] = 0

#在睡覺a[i]分鐘

elif(tmp[i]==0):#到了醒來的時間#上一刻處於睡覺狀態

tmp[i] = 1

tmp_sleeped -= 1

sleeped += tmp_sleeped

print('the %d分鐘: '%time,tmp,sleeped,c)#測試情況

if(initial_c == c and sleeped != 0):return -1

#不會有這個時刻

return time

然後假設在上乙個臨界高度之上還應該多出h』的高度,列出方程:v0+v1+h』(num - i) = 100*num(h+last_h),計算出last_h+h』就得到最後的高度.
def

flooded

(m,n,h,v):

h.sort()#對高度排序

num = m*n

v0 = v

v1 = 0

tmp_h = 0

final_h = 0

count = 0

last_h = 0

i = 0

while(i<100):

if(h[i] != last_h):

if(v0+v1+(num - i)*(h[i]-last_h)*100

< h[i]*num*100 ):

final_h = last_h;break

else:

v1 += (num - i)*(h[i]-last_h)*100

last_h = h[i]

i += 1

x = num - i

print(final_h,(v0+v1-100*num*last_h)/(100*num-x*num)+last_h,i/num)

演算法競賽入門經典第四章習題

習題4 1 題目大意就是 乙個象棋殘局,紅方有n 2 n 7 個棋子,黑方只有乙個將,紅方除了帥,還可能有車,馬,炮,並且要考慮 蹩馬腿 輸入所有棋子的位置,保證局面合法並且紅方已經將軍,判斷紅方是否已經將黑方將死,解題思路 用乙個棋盤儲存紅方可以打到的地方,看黑方將是否有其餘的地方去,在豎直方向只...

《演算法競賽入門經典》第四章小結

題目 編寫乙個函式solve,給定浮點數a,b,c,d,e,f,求解方程組ax by c,dx ey f.任務1 使用assert巨集,讓解不唯一時異常退出。任務2 解不唯一時仍正常返回,但呼叫者有辦法知道解的數量 無解,唯一解,無窮多組解 思考 函式的引數都有哪些,各是什麼型別?任務1 inclu...

演算法競賽入門經典 第四章答案

4.4.1 小問題集錦 任務1 使用assert巨集,讓解不唯一時退出。include includevoid solve double a,double b,double c,double d,double e,double f,double x,double y int main 任務2 解不唯...