问题 E: 便利店
题目描述
天宝来到便利店想买些饮料。
便利店有各种型号的瓶装饮料售卖,不同型号的饮料卖不同的价格。
1瓶0.25升的卖A元,1瓶0.5升的饮料卖B元,1瓶1升的卖C元,1瓶2升的卖D元。
便利店里每种饮料都是无限供应。
天宝要买N升的饮料,最少需要花多少钱呢?聪明的你写个程序帮她算算吧。
已知
1) 1≤A,B,C,D≤10^8 ,1≤N≤10^9
2) 输入的数据都是整数
输入
输入数据按照下面格式
A B C D
N
输出
输出天宝要买N升的饮料所需要花的钱最小值。
样例输入
20 30 70 90
3
样例输出
150
解答(贪心算法):
a, b, c, d = map(int, input().split())
# 读取数据依次将数值以int形式赋值给a b c d
n1 = int(input())
m1 = min(a * 4, b * 2, c) # 1L的最小花费
m2 = min(m1 * 2, d) # 2L的最小花费
ans = n1 // 2 * m2 + n1 % 2 * m1
print(ans)
解答(可能是动态规划):
li = list(map(int, input().split()))
n1 = int(input())
s = [0.25, 0.5, 1, 2] # 水升容量
price = []
for i in range(4):
price.append(2 / s[i] * li[i])
sorted_nums = sorted(enumerate(price), key=lambda x: x[1])
# enumerate遍历一个集合对象,它在遍历的同时还可以得到当前元素的索引位置。
# 此时是根据price的值进行排序,sorted_nums的结构类似于二维列表
idx = [i[0] for i in sorted_nums]
# 排序并且返回下标
ans = 0
for i in range(4):
ans += n1 // s[idx[i]] * li[idx[i]]
n1 = n1 % s[idx[i]]
# 上面的循环是下面注释代码的简化
# ans = n1 // s[idx[0]] * li[idx[0]] + n1 % s[idx[0]] // s[idx[1]] * li[idx[1]] + n1 % s[idx[0]] % s[idx[1]] // s[
# idx[2]] * li[idx[2]] + n1 % s[idx[0]] % s[idx[1]] % s[idx[2]] * li[idx[3]]
print(int(ans))
答案不唯一,必定有更加优化的解法欢迎分享