赞
踩
一个认为一切根源都是“自己不够强”的INTJ
个人主页:用哲学编程-CSDN博客
专栏:每日一题——举一反三
Python编程学习
Python内置函数
目录
3. 空间-时间权衡(Space-Time Tradeoff)
4. 原地修改(In-place Modification)
6. 减少问题规模(Reduce Problem Size)
3. 空间-时间权衡(Space-Time Tradeoff)
4. 原地修改(In-place Modification)
6. 减少问题规模(Reduce Problem Size)
- # 读取输入
- N, D = map(float, input().split()) # 读取月饼种类数N和市场最大需求量D,转换为浮点数
- N = int(N) # 将月饼种类数N转换为整数,因为月饼种类数不应该是小数
- storages = list(map(float, input().split())) # 读取每种月饼的库存量,并转换为浮点数
- prices = list(map(float, input().split())) # 读取每种月饼的总售价,并转换为浮点数
-
- # 构建每种月饼的信息,包括库存量、总售价、和单位售价
- # 注意月饼库存量和总售价可以是小数,初始三个参数可以都设为float型(测试点2)
- infos = []
- for i in range(N): # 遍历每种月饼
- unit_price = prices[i] / storages[i] # 计算每种月饼的单位售价(每吨售价)
- infos.append([storages[i], prices[i], unit_price]) # 将每种月饼的信息存入列表
-
- # 按单位售价从高到低排序
- infos.sort(key=lambda x: x[2], reverse=True) # 按单位售价从高到低对月饼信息进行排序
-
- output = 0.0 # 初始化输出的最大收益
- for storage, total_price, unit_price in infos: # 遍历排序后的月饼信息
- if D == 0.0: # 如果市场需求量已经满足,退出循环
- break
- if storage <= D: # 如果当前月饼的库存量小于等于剩余需求量
- output += total_price # 将当前月饼的总售价加入收益
- D -= storage # 减少相应的需求量
- else: # 如果当前月饼的库存量大于剩余需求量
- output += D * unit_price # 根据剩余需求量计算收益
- D = 0.0 # 将需求量设为0,表示已经满足需求
-
- print(f"{output:.2f}") # 输出最大收益,保留两位小数
这段代码实现了基于库存量和总售价的月饼销售策略,以最大化收益为目标。代码逻辑清晰,基本思路是先计算每种月饼的单位售价(即每吨售价),然后根据单位售价从高到低排序,优先销售单位售价高的月饼,以达到最大收益。以下是对这段代码的专业点评,以及其时间复杂度和空间复杂度的分析。
综合上述步骤,代码的总体时间复杂度为O(N log N),这是因为排序是主要的时间消耗部分。
因此,总体空间复杂度为O(N),因为存储每种月饼的信息占用了线性空间。
这段代码有效地解决了基于单位售价最大化收益的问题。时间复杂度主要由排序部分决定,为O(N log N),而空间复杂度为O(N),这是非常高效且合理的。可以进一步提高代码的健壮性,例如增加更多的错误处理和边界情况处理。总体上,这段代码在逻辑上是正确且高效的。
在这段代码中,时间复杂度的主要瓶颈在于排序操作(O(N log N)),而空间复杂度是O(N),主要是存储月饼信息。针对这两个方面,我们可以尝试一些优化方法。
以下是结合这些优化后的代码示例,使用优先队列来改进时间复杂度,并在一定程度上降低空间复杂度。
- import heapq
-
- # 读取输入
- N, D = map(float, input().split())
- N = int(N)
- storages = list(map(float, input().split()))
- prices = list(map(float, input().split()))
-
- # 创建一个最大堆存储每种月饼的单位售价及其相关信息
- heap = []
- for i in range(N):
- unit_price = prices[i] / storages[i] # 计算单位售价
- heapq.heappush(heap, (-unit_price, storages[i], prices[i])) # 使用负值构建最大堆
-
- output = 0.0 # 初始化收益
- while D > 0 and heap: # 当市场需求量未满足且堆非空时
- unit_price, storage, total_price = heapq.heappop(heap) # 弹出单位售价最高的月饼信息
- unit_price = -unit_price # 将单位售价恢复为正值
- if storage <= D: # 如果当前月饼库存量小于等于需求量
- output += total_price # 将总售价加入收益
- D -= storage # 减少相应的需求量
- else: # 如果当前月饼库存量大于需求量
- output += D * unit_price # 根据剩余需求量计算收益
- D = 0.0 # 将需求量设为0,表示需求已满足
-
- print(f"{output:.2f}") # 输出最终收益,保留两位小数
优化后的代码通过使用最大堆将全局排序操作优化为局部最优选择,同时减少了额外空间开销。时间复杂度从O(N log N)降到O(N log N)(保持不变,但更高效),空间复杂度维持在O(N),进一步提高了效率和资源利用率。
在优化这段代码的过程中,我们使用了一些经典的编程思想和哲学,这些方法不仅提高了算法的效率,也展示了编程中的一些关键原则。以下是详细的分析:
思想:贪心算法是一种在每一步选择中都采取当前状态下最好或最优的选择,最终希望通过一系列当地最优选择达到全局最优。
应用:
思想:优先队列是一种数据结构,它允许以动态的方式对元素进行管理,并保证每次操作都能高效地获取优先级最高或最低的元素。
应用:
思想:程序优化中,有时需要在空间复杂度和时间复杂度之间进行权衡,以找到最优的折中方案。
应用:
思想:在保证正确性的前提下,通过直接在原始数据结构上进行修改,减少额外的空间开销。
应用:
思想:通过将问题分解为多个子问题,分别解决子问题,最终合并结果来解决原问题。
应用:
思想:通过每一步操作减少问题的规模,逐步逼近问题的解。
应用:
每次弹出堆顶元素(即单位售价最高的月饼),并更新市场需求量D,逐步减少问题规模,最终达到停止条件。
理解编程中的哲学和思想能够帮助更好地解决问题和优化代码。以下是一些技巧和建议,帮助你在实际编程中运用这些思想,并举一反三。
技巧:
应用:
技巧:
应用:
技巧:
应用:
技巧:
应用:
技巧:
应用:
技巧:
应用:
通过理解和运用这些编程思想和哲学,可以在解决问题时更具创造性和高效性。关键在于多加练习,逐步培养敏锐的算法设计和优化思维。
感谢。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。