[Python语法练习]CF 591 C - Save the Nature

本文详细解析了二分查找算法的实现过程,通过一个具体的代码示例展示了如何在Python中应用该算法解决特定问题。同时,文章还总结了Python中的一些基本语法,如函数定义、列表操作等,对于初学者理解和掌握Python编程具有一定的帮助。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

解题思路:二分check 代码比较长 所以拿来练习一下py

语法总结:

新建空list

arr = [] 

定义函数 

def (参数1, 参数2, 参数3):

    return 任意类型列表


python 默认向负无穷取整 整除 // 即为 C++ 的floor


输入一个列表

arr = [int(len) for len in input().split()]

代码:

arr = []
sxy = []
sx = []
sy = []
n = 0
x = 0
a = 0
y = 0
b = 0
k = 0

def check (now):
    p = 0
    ret = 0
    for i in sxy:
        if i > now:
            break
        else:
            ret = ret + arr[p] * (x + y) // 100
            p = p + 1
        
    if x >= y:
        for i in sx:
            if i > now:
                break
            else:
                ret = ret + arr[p] * x // 100
                p = p + 1
        for i in sy:
            if i > now:
                break
            else:
                ret = ret + arr[p] * y // 100
                p = p + 1
    else:
        for i in sy:
            if i > now:
                break
            else:
                ret = ret + arr[p] * y // 100
                p = p + 1
        for i in sx:
            if i > now:
                break
            else:
                ret = ret + arr[p] * x // 100
                p = p + 1

    return ret >= k


n = int(input())

while n :
    len = int(input())

    arr.clear()
    
    arr = [int(len) for len in input().split()]
    
    x, a = map(int, input().split())
    y, b = map(int, input().split())

    k = int(input())
    
    arr.sort(reverse=True)

    sxy.clear()
    sx.clear()
    sy.clear()

    for i in range(1, len + 1):
        if i % a == 0 and i % b == 0:
            sxy.append(i)
        elif i % a == 0:
            sx.append(i)
        elif i % b == 0:
            sy.append(i)
        
    fst = 0
    lst = len
    ans = 0

    if not check(len):
        print('-1')
    else:

        while(fst <= lst):
            mid = (fst + lst) // 2
            if check(mid):
                lst = mid - 1
                ans = mid
            else:
                fst = mid + 1

        print(ans)
    
    n = n - 1

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值