当前位置: 首页 > news >正文

蓝桥杯 之 二分

文章目录

  • 习题
    • 肖恩的n次根
    • 分巧克力
    • 2.卡牌

  • 二分是十分重要的一个算法,常常用于求解一定范围内,找到满足条件的边界值的情况
  • 主要分为浮点数二分整数二分
  • 二分问题,最主要是写出这个check函数,这个check函数最主要就是使用模拟的方法进行求解
    二分查找算法一
    二分算法(二)
    在这里插入图片描述

函数单调

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

0-1单调

在这里插入图片描述
在这里插入图片描述

习题

肖恩的n次根

肖恩的n次根

在这里插入图片描述

  • 这题是一个浮点数二分的问题,我们只用确定区间的左范围和右范围,确定一个精度进行判断,最好是超过题目要求的精度的100
import os
import sys

# 请在此输入您的代码
# 浮点数二分法

# 判断是否小于等于target
def check(a1,b1,target):
  ans = 1
  for i in range(b1):
    ans *= a1
  return ans <= target

a,b = map(int,input().split())

l,r = 0,1000
while r - l > 1e-9:
  mid = (l+r)/2
  if check(mid,b,a):
    l = mid 
  else:
    r = mid

print(int(r*1000))
  

分巧克力

分巧克力

在这里插入图片描述

  • 判断是否存在单调性:当你分到的巧克力的边长越长,那么可以切分的巧克力的数量就越少,所以说是存在这个单调性的
  • 那么确定一个二分的范围:最少的边长,肯定是1,最大的边长,那么就可以认为是最长的w,h
import os
import sys

# 请在此输入您的代码

N,K = map(int,input().split())
cho = []
maxnum = 0
for _ in range(N):
  h,w = map(int,input().split())
  maxnum = max(maxnum,h,w)
  cho.append([h,w])

def check(mid):
  cou = 0
  for i in range(N):
    cou += (cho[i][0] // mid )* (cho[i][1] // mid)
  return cou >= K

l ,r = 1,maxnum
ans = 0 
while l <= r:
  mid = (l+r) // 2
  if check(mid):
    ans = max(ans,mid)
    l = mid + 1
  else:
    r = mid - 1
print(ans)

  • 注意上面的题目,有些同学可能判断不了,最后的答案是l还是r,所以我们直接多开一个变量,当满足情况的时候更新答案即可,最后直接输出这个ans
  • 当然,在理解的情况,我们当然是输出不满足情况下修改的那个变量,在这个题目当中,就是r
import os
import sys

# 请在此输入您的代码

N,K = map(int,input().split())
cho = []
maxnum = 0
for _ in range(N):
  h,w = map(int,input().split())
  maxnum = max(maxnum,h,w)
  cho.append([h,w])

def check(mid):
  cou = 0
  for i in range(N):
    cou += (cho[i][0] // mid )* (cho[i][1] // mid)
  return cou >= K

l ,r = 1,maxnum
while l <= r:
  mid = (l+r) // 2
  if check(mid):
    l = mid + 1
  else:
    r = mid - 1
print(r)

2.卡牌

2.卡牌

在这里插入图片描述

  • 确定二分的对象,那就是对于可以组成的牌的套数,对应的范围0到max(a)+max(b),因为尽可能把最大的情况都得包括进去
  • check函数的确定,就是检查,我们要求组成mid套牌,能否在每一种牌都可以凑出mid张,如果有一种不满足,提前返回False,当然得考虑这个补充的牌的数量是否超过m
import os
import sys

# 请在此输入您的代码

n,m = map(int,input().split())
a = list(map(int,input().split()))
b = list(map(int,input().split()))

def check(mid):
  needchange = 0
  for i in range(n):
    # 模拟判断情况,如果强制情况下都不满足,那直接返回不满足
    if a[i] + b[i] < mid:
      return False
    if a[i] < mid:
      needchange += (mid - a[i] )
    if needchange > m :
      return False
  return True

l,r = 0,max(a)+max(b)
ans = 0
while l <= r:
  mid = (l+r) // 2
  if check(mid):
    ans = max(ans,mid)
    l = mid + 1
  else:
    r = mid - 1
print(ans)

http://www.dtcms.com/a/99473.html

相关文章:

  • 8、linux c 信号机制
  • sass报错,忽略 Sass 弃用警告,降级版本
  • 笔记本裸机安装centos,找不到wifi设备问题
  • 英语学习笔记1
  • 命悬生死线:当游戏遭遇DDoS围剿,如何用AI破局?
  • 【Linux网络与网络编程】01.初识网络
  • 【设计模式】状态模式
  • Redis 分布式锁实现深度解析
  • RHCA核心课程技术解析5:红帽高可用性集群架构与深度实践
  • 基于Huggingface的lerobot项目在so-arm100机械臂上的复现笔记
  • 创建SpringBoot项目报错
  • Java创建对象有几种方式?
  • 吴恩达深度学习复盘(1)神经网络与深度学习的发展
  • 什么是UI自动化测试?什么项目适合做UI自动化测试?
  • 编程考古-Borland JBuilder:一场关于Java灵魂的战争与救赎
  • Android 设计模式之适配器模式
  • 智能路由系统-信息泄露漏洞挖掘
  • 简单使用LlamaIndex实现RAG
  • (四)GTM_TOM模块定时器中断应用
  • 基于Python深度学习的鲨鱼识别分类系统
  • 垃圾回收机制的几种实现机制简介
  • 【差分】详解一维前缀和和差分问题
  • Java高级JVM知识点记录,内存结构,垃圾回收,类文件结构,类加载器
  • 无人机进行航空数据收集对于分析道路状况非常有用-使用无人机勘测高速公路而不阻碍交通-
  • BurpSuit抓包失败-基础配置
  • 用war解压缩.7zip文件解压缩正在进行但是结束后文件消失了
  • 计算机二级考前急救(Word篇)
  • python:将mp4视频快进播放,并保存新的视频
  • OpenHarmony子系统开发 - 安全(二)
  • Redisson分布式锁深度解析:原理与实现机制