蓝桥杯纪念品分组(Python)

这一题的贪心思路就是保证两个纪念品的价格加起来尽量接近每组纪念品的上限w,那么我们就可以把纪念品的价格放到列表里面,然后排序这样我们只需要每次判断最大的是否超出给定的上限w,如果没有就把最小的和最大的分为一组,这就是这一题的贪心思路了。

import os
import sys

# 请在此输入您的代码
read = sys.stdin.readline
#输入每组纪念品的上限w
w = int(read())
#输入纪念品的总数
n = int(read())
#定义一个空的数组用来存每个纪念品的价格
a = []
#把数据放入数组a里
for i in range(n):
  a.append(int(read()))
#对纪念品的价格进行排序
a.sort()
#定义两个变量用来记录每次查找的纪念品下标
l,r = 0,n - 1
#用来统计纪念品的分组数量
ans = 0
#定义一个死循环用来遍历
while True:
  #这种情况就是把列表里面的所有数据都判断完了直接跳出循环
  if l > r:
    break
  #这种情况就是列表里面就剩一个数了,所以直接单独分一组然后跳出循环
  if l == r:
    ans += 1
    break
  #这个就是判断价值最小的和价值最大的相加是否超出给定的值w
  #如果没有超出那么移动下标,并且分组加一
  if a[l] + a[r] <= w:
    ans += 1
    l += 1
    r -= 1
  #当超出的时候那么就单独给价值最大的分一组,并且移动下标避免重复判断
  else:
    ans += 1
    r -= 1
print(ans)



    

 

这类简单的贪心问题只需要我们多刷题累计贪心思路,只需要掌握其中的贪心思路反而代码实现是不难的。贪心类的题目如果一般没有做过类似的题,在比赛现场想的话还是很费时的,用带我入门老师的话来讲贪心类的题都是人类智慧题,一开始看这道题如果没有思路,那么在比赛中你基本就不太可能想出来了,所以革命还未成功,同志还需努力。

  • 10
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值