题解:蓝桥云课 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
posted @ 2026-03-04 10:55  团爸讲算法  阅读(2)  评论(0)    收藏  举报