二分
def bin_search_begin(x):
left = 0
right = n - 1
while left < right:
mid = (left + right) // 2
if lis[mid] >= x:
right = mid
else:
left = mid + 1
return left
def bin_search_end(x):
left = 0
right = n - 1
while left < right:
mid = (left + right + 1) // 2
if lis[mid] <= x:
left = mid
else:
right = mid - 1
return left
def general_bin_search(x):
# 具体问题具体返回l和r的值
left = -1
right = n
while left + 1 < right:
mid = (left + right) // 2
if lis[mid] <= x:
left = mid
else:
right = mid
# 返回后继+1,如果没找到就返回应该插入的位子
return left + 1
if __name__ == '__main__':
n = 6
lis = [1, 1, 3, 3, 3, 7]
print(bin_search_begin(3))
print(bin_search_end(3))
print(general_bin_search(3))
AcWing
790. 数的三次方根
https://www.acwing.com/problem/content/description/792/
n = float(input())
sep = 1e-8
l = -10000-sep
r = 10000+sep
while l+sep < r:
mid = (l+r)/2
if mid*mid*mid <= n:
l = mid
else:
r = mid
print("%.6f"%(l))
789. 数的范围
https://www.acwing.com/problem/content/791/
def bin_search_start(x):
left = 0
right = n-1
while left < right:
mid = (left + right) >> 1
if lis[mid] >= x:
right = mid
else:
left = mid + 1
if left == n:
return -1
if lis[left] != x:
return -1
return left
def bin_search_end(x):
left = 0
right = n-1
while left < right:
mid = (left + right+1) >> 1
# print(mid)
if lis[mid] <= x:
left = mid
else:
right = mid - 1
return left
n, q = map(int, input().split())
lis = list(map(int, input().split()))
res = []
for i in range(q):
x = int(input())
start = bin_search_start(x)
if start==-1:
res.append((-1, -1))
continue
end = bin_search_end(x)
res.append((start, end))
for s in res:
print(s[0], s[1])
102. 最佳牛围栏
https://www.acwing.com/problem/content/description/104/
def check(avg):
max_sum = [0]
for i in range(1, n + 1):
max_sum.append(max_sum[-1] + lis[i] - avg)
i, j = 0, f
minv = 0
while j <= n:
minv = min(minv, max_sum[i])
if max_sum[j] - minv >= 0:
return True
i += 1
j += 1
return False
n, f = map(int,input().split())
lis = [0]
max_n = 0
for i in range(n):
num = int(input())
max_n = max(max_n, num)
lis.append(num)
l, r = 0, max_n
sep = 1e-5
while r - l > sep:
mid = (r + l) / 2
if check(mid):
l = mid
else:
r = mid
# print(r)
# print(l)
print(int(r * 1000))
蓝桥杯
分巧克力
https://www.lanqiao.cn/problems/99/learning/?page=1&first_category_id=1&name=%E5%88%86%E5%B7%A7%E5%85%8B%E5%8A%9B
def check(mid):
cnt = 0
for i in range(n):
cnt += (lis[i][0] // mid) * (lis[i][1] // mid)
if cnt >= k:
return True
return False
n, k = map(int, input().split())
lis = []
for i in range(n):
u = list(map(int, input().split()))
lis.append(u)
l, r = 0, 1000010
while l + 1 != r:
mid = l + r >> 1
if check(mid):
l = mid
else:
r = mid
print(l)
跳石头
https://www.lanqiao.cn/courses/17169/learning/?id=792725&compatibility=false
def check(mid):
cnt = 0
pos = 0
for i in range(1,N+1):
if lis[i]-pos < mid:
cnt += 1
else:
pos = lis[i]
if cnt <= M:
return True
else:
return False
L,N,M = map(int,input().split())
if N == 0:
print(L)
else:
lis = [0]
for i in range(N):
num = int(input())
lis.append(num)
l,r = -1,L
while l+1!=r:
mid = l+r>>1
if check(mid):
l = mid
else:
r = mid
print(l)
求阶乘
https://www.lanqiao.cn/problems/2145/learning/?page=1&first_category_id=1&name=%E6%B1%82%E9%98%B6%E4%B9%98
def get_count(x):
# 统计5的数量
count = 0
while x//5:
count += x//5
x //=5
return count
k = int(input())
l = 0
r = int(1e19//2)
while l+1!=r:
mid = r+l>>1
if get_count(mid)>=k:
r = mid
else:
l = mid
if get_count(r)==k:
print(r)
else:
print(-1)
一元三次方程求解
https://www.lanqiao.cn/problems/764/learning/?page=1&first_category_id=1&name=%E4%B8%80%E5%85%83%E4%B8%89%E6%AC%A1%E6%96%B9%E7%A8%8B%E6%B1%82%E8%A7%A3
def F(x):
return a*x**3 + b*x**2 + c*x + d
# 请在此输入您的代码
a,b,c,d = map(float,input().split())
res = []
for i in range(-100,100):
l = i
r = i+1
if F(l)==0:
print(f'{l:.2f}',end=' ')
if F(l)*F(r)<0:
while l+1e-3<r:
mid = (l+r)/2
if F(mid)*F(r)<=0:
l = mid
else:
r = mid
print(f'{l:.2f}',end=' ')