这一题的贪心思路就是保证两个纪念品的价格加起来尽量接近每组纪念品的上限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)
这类简单的贪心问题只需要我们多刷题累计贪心思路,只需要掌握其中的贪心思路反而代码实现是不难的。贪心类的题目如果一般没有做过类似的题,在比赛现场想的话还是很费时的,用带我入门老师的话来讲贪心类的题都是人类智慧题,一开始看这道题如果没有思路,那么在比赛中你基本就不太可能想出来了,所以革命还未成功,同志还需努力。