为使得参加晚会的同学所获得 的纪念品价值相对均衡,他要把购来的纪念品根据价
格进行分组,但每组最多只能包括两件纪念品, 并且每组纪念品的价格之和不能超
过一个给定的整数。为了保证在尽量短的时间内发完所有纪念品,乐乐希望分组的
数目最少。
你的任务是写一个程序,找出所有分组方案中分组数最少的一种,输出最少的分组数目。
输入格式:
共n+2n+2行:
第1行包括一个整数w,为每组纪念品价格之和的上上限。
第2行为一个整数n,表示购来的纪念品的总件数G。
第3至n+2行每行包含一个正整数 Pi 表示所对应纪念品的价格。
输出格式:
一个整数,即最少的分组数目。
p y t h o n \huge python python蒟蒻心血来潮发一篇题解
贪心策略不难想到:
-
尽量最大的和最小的一组
-
不然最大的单独一组
这样得到的组数是最少的
具体怎么实现呢?
- 定义 p , q p,q p,q两个变量, p = 0 p=0 p=0 ; q = n − 1 q=n-1 q=n−1
- 如果 a [ p ] + a [ q ] < = w a[p]+a[q]<=w a[p]+a[q]<=w (a按升序排好)
- t o t + + tot++ tot++, p p p后指一位( p + + p++ p++), q q q前指一位( q − − q-- q−−)
- 若 p > q p>q p>q,输出 t o t tot tot,程序结束(撒花).否则重复 2. 2. 2. 3. 3. 3.
贴代码
a=[]
#输入
w=int(input())
n=int(input())
for x in range(n):
a.append(int(input()))
p=0;q=n-1;tot=0 #初始化
a.sort() #排序
for x in range(n):
if(p>q): #检索完毕,退出循环
break
if(a[p]+a[q]<=w): #满足要求,计数器+1,指针移动
tot=tot+1;p=p+1;q=q-1
else: #最大的单独一组
q=q-1;tot=tot+1
print(tot) #输出