题目描述
P 老师需要去商店买 n n n 支铅笔作为小朋友们参加 NOIP 的礼物。她发现商店一共有 3 3 3 种包装的铅笔,不同包装内的铅笔数量有可能不同,价格也有可能不同。为了公平起见,P 老师决定只买同一种包装的铅笔。
商店不允许将铅笔的包装拆开,因此 P 老师可能需要购买超过 n n n 支铅笔才够给小朋友们发礼物。
现在 P 老师想知道,在商店每种包装的数量都足够的情况下,要买够至少 n n n 支铅笔最少需要花费多少钱。
输入格式
第一行包含一个正整数 n n n,表示需要的铅笔数量。
接下来三行,每行用 2 2 2 个正整数描述一种包装的铅笔:其中第 1 1 1 个整数表示这种包装内铅笔的数量,第 2 2 2 个整数表示这种包装的价格。
保证所有的 7 7 7 个数都是不超过 10000 10000 10000 的正整数。
输出格式
1 1 1 个整数,表示 P 老师最少需要花费的钱。
输入输出样例
输入
57
2 2
50 30
30 27
输出
54
方式-字典
代码
class Solution:
@staticmethod
def oi_input():
"""从标准输入读取数据,返回 (n, 包装字典) """
n = int(input())
packages = {} # 外层字典仅存储包装信息
for i in range(1, 4): # 键为1~3
a, b = map(int, input().split())
packages[i] = (a, b) # 元组存储数量和价格
return n, packages
@staticmethod
def oi_test():
"""提供测试数据,返回 (n, 包装字典) """
return 57, {
1 : (2, 2),
2 : (50, 30),
3 : (30, 27)
}
@staticmethod
def solution(n, package_data): # n和包装字典作为独立参数
min_cost = float('inf')
for pkg in package_data.values(): # 直接遍历字典的值
quantity, price = pkg
need = (n + quantity - 1) // quantity # 向上取整技巧
min_cost = min(min_cost, need * price)
print(min_cost)
# 暴露为模块级函数
oi_input = Solution.oi_input
oi_test = Solution.oi_test
solution = Solution.solution
if __name__ == '__main__':
n, packages= oi_test()
# n, packages= oi_input()
solution(n, packages)