CCF CSP 202303-2 垦田计划 python 二分法

CCF CSP 202303-2 垦田计划 python 二分法_第1张图片CCF CSP 202303-2 垦田计划 python 二分法_第2张图片

CCF CSP 202303-2 垦田计划 python 二分法_第3张图片 题目解析

 伴随着开垦天数的增加,需要花费的资源会逐渐减少,因此这是一个典型的二分问题。

 关于二分

以在升序数组中找一个数为例:

每次考察数组当前部分的中间元素,如果中间元素刚好是要找的,就结束搜索过程;

如果中间元素小于所查找的值,那么左侧的只会更小,不会有所查找的元素,只需到右侧查找;

如果中间元素大于所查找的值同理,只需到左侧查找。

代码解析

二分开始的左边界为工程允许的最小天数L,右边界为工程天数列表里的最大天数R,中间值取(L+R)/2。循环结束条件为L<=R,找到最优解。

【注意】二分法中的mid加一和减一,可以避免死循环

###### 数据读入 ######
n, m, k = map(int, input().split())
t = []
t.append(0)
c = []
c.append(0)
for i in range(1,n+1):
    tmpT, tmpC = map(int, input().split())
    t.append(tmpT)
    c.append(tmpC)

###### 计算天数对应的资源消耗 ######
def countTotalM(day):
    totalM = 0
    for i in range(1, n+1):
        if day >= t[i]: continue
        else: totalM += (t[i] - day) * c[i]
    return totalM

###### 二分法 ######
R = max(t)
L = k

while(L<=R):
    # 计算天数为(L+R)/2时,需要消耗的资源totalM
    mid = int((L + R) / 2)
    totalM = countTotalM(mid)

    if totalM > m:  # 消耗资源太多了,需要增加天数,减少资源消耗
        L = mid + 1
    else:   # 消耗资源少了,还可以减少天数,消耗更多的资源
        R = mid - 1

print(L)



你可能感兴趣的:(python,开发语言,算法)