蓝桥备赛——循环+二分

本文介绍了在蓝桥竞赛中如何利用循环和二分搜索解决实际问题。通过具体题目,展示了如何遍历二维列表并用二分查找找到满足条件的正方形边长,以切割出至少k个正方形。文章详细解析了代码实现过程和思路。
摘要由CSDN通过智能技术生成

题干 

AC code


n,k=map(int,input().split())
data=[]
for i in range(n):
    h,w=map(int,input().split())
    mid=[]
    mid.append(h)
    mid.append(w)
    data.append(mid)
front,tail=1,100000
def find(edge_len):
    global k
    ans=0
    for wid,hei in data:
        ans+=(wid//edge_len)*(hei//edge_len)
        if ans>=k:
            return True
    return False
while front<=tail:
    mid=(front+tail)//2
    if not find(mid):
        tail=mid-1
    else:
        front=mid+1
print(tail)

 相关知识

对于list of list这类二维列表,可以有这种使用方式指代列表中的数据。

for a,b in 列表:


n,k=map(int,input().split())
data=[]
for i in range(n):
    h,w=map(int,input().split())
    mid=[]
    mid.append(h)
    mid.append(w)
    data.append(mid)
def find(edge_len):
    global k
    ans=0
    for wid,hei in data:
        ans+=(wid+hei)*edge_len
    return ans
print(find(3))
print(find(2))

如上图所示,对应输出可知

(5+4)*3+(3+2)*3=27+15=42

(5+4)*2+(3+2)*2=18+10=28

对应可以证明该想法正确。

[[1,3],[6,5],[7,9]]对应可以使用a,b in list进行指代,表示对应list中的元素。

思路整理(逐行代码解释)

  1. for wid,hei in data:: 遍历data列表中的每个长方形的宽度和高度。

  2. ans+=(wid//edge_len)*(hei//edge_len): 计算当前长方形可以切割出的正方形数量,并累加到ans中。

  3. if ans>=k: 如果ans大于或等于k,表示当前边长edge_len满足要求,可以切割出至少k个正方形。

  4. return True: 返回True,表示当前边长edge_len符合条件。

  5. return False: 如果循环结束后还未找到符合条件的边长,返回False。

  6. while front<=tail: 进入二分查找循环,当最小可能边长小于等于最大可能边长时执行。

  7. mid=(front+tail)//2: 计算当前边长的中点。

  8. if not find(mid):如果当前边长mid无法切割出至少k个正方形。

  9. tail=mid-1: 更新最大可能边长为mid-1。

  10. else::如果当前边长mid可以切割出至少k个正方形。

  11. front=mid+1: 更新最小可能边长为mid+1。

  12. print(tail): 输出最大符合条件的正方形边长。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

牛哥带你学代码

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值