OD 算法题 B卷【水果摊小买卖】

文章目录

  • 水果摊小买卖

水果摊小买卖

  • 小王手里有点闲钱,想做点水果买卖,给出两个数组m, n, m[i]表示第i个水果的成本价,n[i]表示第i个水果能卖出的价格;
  • 假如现在有本钱k,试问最后最多能赚多少钱?
  • 每种水果只能买一次,只能卖一次;
  • m,n <= 50
  • 数组元素为正整数,不超过1000;

输入描述:
第一行输入数组m
第二行输入数组n
第三行输入本钱k

输出描述:
最多能赚到多少钱(包含本钱)

示例1
输入:
4,2,6,4
5,3,8,7
15
输出:
22

python实现:

  • 贪心算法;
  • 计算每个水果的利润率,并降序排序;
  • 优先购买利润高的水果(直到本钱不够买下一个水果),并将卖的钱累加到本钱中,尽可能地将所有的水果都买卖一次;
  • visit数组用来标记每个水果是否已参与买卖;

# 输入数据
m = list(map(int, input().strip().split(",")))
n = list(map(int, input().strip().split(",")))
k = int(input().strip())

# 计算每种水果的利润,并降序排序
earn_rate = []
for i in range(len(m)):
    earn_rate.append([i, (n[i] - m[i]) / m[i]])
# 利率降序
earn_rate.sort(key=lambda i: -i[1])

# 记录每种水果是否已买卖过
visit = [0 for _ in range(len(m))]
profit = []
while True:
    i = 0
    while i < len(earn_rate):
        # 当前商品j
        j = earn_rate[i][0]
        # 当前商品未买卖且本钱足够
        if visit[j] == 0 and m[j] <= k:
            k -= m[j]
            profit.append(n[j])
            visit[j] = 1  # 标记已买卖

        i += 1

    # 挣的钱累加到本钱中
    if len(profit) > 0:
        for x in profit:
            k += x
        profit = []
    else:
        break

print(k) # 连同本钱一起挣到的钱

你可能感兴趣的:(OD算法题,B卷,贪心算法)