[python-CSP-二分]202303-2 垦田计划

问题

问题描述

思路

这个题给的提示就是第二题上来一定要先写暴力,不要直接上其他想法,要不然思路容易跑偏。。。哎就差一点点就拿满了……
这里写完暴力之后得70分,那就是后面优化的问题,里面读数据不能优化,那就优化后面的搜索
这里的搜索实质上是在搜索一个合适的天数,可以注意到这个天数有一个很明显的分界的状态,左侧和右侧区分很明显,这样就可以用二分查找来优化

代码

70

一定先写暴力解法

n,m,k = map(int,input().split())
# 区域总数 资源数量 最少天数
need_days = [0]*n
need_source = [0]*n
max_day,min_day = 0,k
for i in range(n):
    t,c = map(int,input().split())
    need_days[i],need_source[i] = t,c
    max_day = max(max_day,t)
    min_day = min(min_day,t)

for day in range(min_day,max_day+1):
    source = m
    for i in range(n):
        if need_days[i]>day:
            source-=need_source[i]*(need_days[i]-day)
    if source>=0:
        print(day)
        break

100分代码

在遍历里面卡值->用二分

n,m,k = map(int,input().split())
# 区域总数 资源数量 最少天数
need_days = [0]*n
need_source = [0]*n
max_day,min_day = 0,k
for i in range(n):
    t,c = map(int,input().split())
    need_days[i],need_source[i] = t,c
    max_day = max(max_day,t)
    min_day = min(min_day,t)

l,r = min_day,max_day+1
# for day in range(min_day,max_day+1):
while l<r:
    day = (l+r)//2
    source = m
    for i in range(n):
        if need_days[i]>day:
            source-=need_source[i]*(need_days[i]-day)
    if source>=0:
        r = day
    else:
        l=day+1
print(l)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值