[LGOJ] 题解 P1094 【纪念品分组】

为使得参加晚会的同学所获得 的纪念品价值相对均衡,他要把购来的纪念品根据价
格进行分组,但每组最多只能包括两件纪念品, 并且每组纪念品的价格之和不能超
过一个给定的整数。为了保证在尽量短的时间内发完所有纪念品,乐乐希望分组的
数目最少。

你的任务是写一个程序,找出所有分组方案中分组数最少的一种,输出最少的分组数目。
输入格式:
共n+2n+2行:

第1行包括一个整数w,为每组纪念品价格之和的上上限。

第2行为一个整数n,表示购来的纪念品的总件数G。

第3至n+2行每行包含一个正整数 Pi   表示所对应纪念品的价格。

输出格式:
一个整数,即最少的分组数目。

p y t h o n \huge python python蒟蒻心血来潮发一篇题解

贪心策略不难想到:
  • 尽量最大的和最小的一组

  • 不然最大的单独一组

这样得到的组数是最少的


具体怎么实现呢?

  1. 定义 p , q p,q p,q两个变量, p = 0 p=0 p=0 ; q = n − 1 q=n-1 q=n1
  2. 如果 a [ p ] + a [ q ] &lt; = w a[p]+a[q]&lt;=w a[p]+a[q]<=w (a按升序排好)
  3. t o t + + tot++ tot++, p p p后指一位( p + + p++ p++), q q q前指一位( q − − q-- q)
  4. p &gt; q p&gt;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) #输出
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值