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.具體做法為 記錄已知的最小值與最大值,對輸入 的...