点击此处查看其它题目http://t.csdn.cn/x6OiC
题目描述
小蓝很喜欢吃巧克力,他每天都要吃一块巧克力。
一天小蓝到超市想买一些巧克力。超市的货架上有很多种巧克力,每种巧克力有自己的价格、数量和剩余的保质期天数,小蓝只吃没过保质期的巧克力,请问小蓝最少花多少钱能买到让自己吃 x 天的巧克力。
输入描述
输入的第一行包含两个整数 x,n,分别表示需要吃巧克力的天数和巧克力的种类数。
接下来 n 行描述货架上的巧克力,其中第 i 行包含三个整数 ai,bi,ci,表示第 i 种巧克力的单价为 ai,保质期还剩 bi 天(从现在开始的 bi 天可以吃),数量为 ci。
输出描述
输出一个整数表示小蓝的最小花费。如果不存在让小蓝吃 x 天的购买方案,输出 −1−1。
输入输出样例
示例
输入
10 3
1 6 5
2 7 3
3 10 10
输出
18
样例说明
一种最佳的方案是第 11 种买 55 块,第 22 种买 22 块,第 33 种买 33 块。前 55 天吃第 11 种,第 66、77 天吃第 22 种,第 88 至 1010 天吃第 33 种。
评测用例规模与约定
对于 3030% 的评测用例,n,x≤1000;
对于所有评测用例,1≤n,x≤100000,1≤ai,bi,ci≤109。
思维:
首先两个限制条件,1:价格,2:保质期,我们要吃够n天,不吃过期的,还要吃的便宜
如果我们将巧克力按照价格递增排序,就可以解决价格问题
对于保质期问题,我们可以从后往前考虑,因为如果我们从前往后考虑,有可能会导致吃不够n天
例如:我们想吃够7天 ,巧克力有 A:1元 ,保质期7天,剩余4个 B:2元,保质期3天,剩余3个,此时从前往后考虑就是先吃a,结果会导致吃不够7天
代码实现:
n,m=map(int,input().split())
arr=[]
for _ in range(m):
arr.append(list(map(int,input().split())))
arr.sort(key=lambda x:x[0])
y=n#日期
s=0#共花钱
while y>0:#日期倒序保证了日期选择合理
for x in arr:#顺序保证了低价
if x[1]>=y and x[2]>0:#没过保质期而且还有
x[2]-=1
s+=x[0]
break
else:#没有满足条件
break
y-=1#日期向前
if y>0:
print(-1)
else:
print(s)