题解:蓝桥云课 532 纪念品分组
【题目来源】
蓝桥云课:1.纪念品分组 - 蓝桥云课 (lanqiao.cn)
【题目描述】
元旦快到了,校学生会让乐乐负责新年晚会的纪念品发放工作。为使得参加晚会的同学所获得的纪念品价值相对均衡,他要把购来的纪念品根据价格进行分组,但每组最多只能包括两件纪念品,并且每组纪念品的价格之和不能超过一个给定的整数。为了保证在尽量短的时间内发完所有纪念品,乐乐希望分组的数目最少。
你的任务是写一个程序,找出所有分组方案中分组数最少的一种,输出最少的分组数目。
【输入】
第 \(1\) 行包括一个整数 \(w(80≤w≤200)\),为每组纪念品价格之和的上限。
第 \(2\) 行为一个整数 \(n(1≤n≤30000)\),表示购来的纪念品的总件数。
第 \(3~n+2\) 行每行包含一个正整数 \(p_i(5≤p_i≤w)\),表示所对应纪念品的价格。
【输出】
输出一行,包含一个整数,即最少的分组数目。
【输入样例】
100
9
90
20
20
30
50
60
70
80
90
【输出样例】
6
【算法标签】
《蓝桥云课 532 纪念品分组》 #2007# #贪心# #排序# #NOIP#
【代码详解】
#每组纪念品价格上限
w = int(input())
#n个纪念品
n = int(input())
#n个纪念品的价格a
a = []
for i in range(n):
a.append(int(input()))
#1、排序
a.sort()
#最小的和最大的下标
l, r = 0, n-1
ans = 0
while True:
if l==r:
ans+=1
break
if l > r:
break
#能否配对
if a[l]+a[r]<=w:
ans += 1
l += 1
r -= 1
else:
#大的单独数
ans += 1
r -= 1
print(ans)
【运行结果】
100
9
90
20
20
30
50
60
70
80
90
6
浙公网安备 33010602011771号