二分bisect

二分

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=' ')
  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值