最小距離最大值問題

2021-09-10 06:51:56 字數 2548 閱讀 5265

def check2(a, m, x):

k, c = 0, 0

for i in range(1, len(a)):

if a[i]-a[k] < x:#當前距離小於x,刪除元素a[i]

c += 1

else: #當前距離不小於x,更新左邊界

k = i

return c <= m

def distance(a, m):

left, right, ans = 1, a[-1], 0

while left <= right:

mid = (left + right) // 2

if check(a, m, mid):

ans = mid

left = mid + 1

else:

right= mid - 1

return ans

def distance2(a, m):

left, right, ans = 1, a[-1], 0

while left <= right:

mid = (left + right) // 2

if check2(a, m, mid):

ans = mid

left = mid + 1

else:

right= mid - 1

return ans

def distance3(a, m):

for ans in range(a[-1], 0, -1):

if check(a, m, ans):

return ans

def distance4(a, m):

for ans in range(a[-1], 0, -1):

if check2(a, m, ans):

return ans

def min_dis(a):#返回最小距離

left = 1 #定位第乙個元素,值為0的元素表示已經被刪除

while a[left] == 0:

left += 1

d = a[left] #初始化最短距離為第一條線段的長度

right = left + 1

while right < len(a):

if a[right] == 0:#定位線段的右邊界 

right += 1

else:

if a[right] - a[left] < d: #更新最小距離

d = a[right] - a[left]

left = right #處理下一條線段

right = left + 1

return d

#效率很低的回溯演算法

def distance5(a, m):

def dfs(b, top):

nonlocal dis

if top == m:

dis = max(min_dis(b), dis)

else:

for i in range(len(b)):

if b[i] > 0:

t = b[i]

b[i] = 0 #刪除b[i]

dfs(b, top + 1)

b[i] = t #還原b[i]

b = list(a)

dis = 0

dfs(b, 0)

return dis

import random  

import time

a = [0] * 100

for i in range(1, 100):

a[i] = a[i-1] + random.randint(10,20)

print(a)

t0 = time.process_time() 

for i in range(85):

print(distance(a, i),end=" ")

t1 = time.process_time()

print()

print(t1 - t0)

t0 = time.process_time() 

for i in range(85):

print(distance2(a, i),end=" ")

t1 = time.process_time()

print()

print(t1 - t0)

t0 = time.process_time() 

for i in range(85):

print(distance3(a, i),end=" ")

t1 = time.process_time()

print()

print(t1 - t0)

t0 = time.process_time()

t0 = time.process_time() 

for i in range(85):

print(distance4(a, i),end=" ")

t1 = time.process_time()

print()

print(t1 - t0)

最大值最小值問題

看了不是很懂,先把別人的 放著,日後在研究。程式8 3 5.cpp 定義控制台應用程式的入口點。include stdafx.h 目標學會用猜數字 二分 的方法,換個角度來解決問題 include include includeconst int maxn 100000 int a maxn n,m...

最大值 最小值

求最大最小的時候有點小技巧,就是我們兩個兩個的比較,把大個跟當前最大比較,小的跟當前最小的比較,這樣就會節約一點比較時間,有原來的2 n到3 n 2。include include 得到最大最小值 int getmaxmin int ndata,int nlen,int pnmax,int pnmi...

最小與最大值

輸入 乙個包含n個數的集合a 輸出 集合a的最大值最小值 單一求解最大值與最小值可以通過打擂台的方法來實現,求解最大值或者最小值需要比較n 1次,若同時要求求出最大值與最小值比較的次數為2 n 2次.事實上我們有比這個更快的演算法,比較次數為3n 2.具體做法為 記錄已知的最小值與最大值,對輸入 的...