第一行输入两个整数
——煤炭数量与铁矿石总量。接下来
行,第
行输入两个整数
:
![]()
——可融化矿石数量;
![]()
为偶数
——燃烧时长。
数据保证
。
输出一个整数,表示烧炼完
单位铁矿石所需的最短时间。
5 28 6 8 5 4 6 10 5 2 6 4
14
选择煤炭
,并对煤炭
施放魔法:
![]()
升级后燃烧
秒,融化
单位;
![]()
燃烧
秒,融化
单位;
![]()
燃烧
秒,融化
单位;
![]()
燃烧
秒,融化
单位。
总计融化
单位铁矿石,耗时
秒,为最优方案。
n, m = list(map(int, input().split()))
original_m = m
lis = []
for _ in range(n):
cur = list(map(int, input().split()))
lis.append(cur)
#先选效率最高的煤
lis.sort(key = lambda x:(x[0]/x[1]))
t = 0
li = []
res = float("inf")
while m > 0:
cur = lis.pop()
li.append(cur)
m -= cur[0]
t += cur[1]
# 每取一块煤就尝试升级所有已选煤
for k in range(len(li)):
i = li[k]
# 升级后总融化量足够的判断
if (original_m - m) + i[0] >= original_m:
new_sum_x = (original_m - m) + i[0]
new_t = t - i[1] // 2
# 从最后一块(效率最低)开始去掉多余的煤
j = len(li) - 1
while j >= 0:
if j == k: # 不能去掉正在升级的煤
j -= 1
continue
if new_sum_x - li[j][0] >= original_m:
new_sum_x -= li[j][0]
new_t -= li[j][1]
j -= 1
res = min(res, new_t)
print(res)
10/11 组用例通过