(程序设计方法与实践)打包礼物

龙龙为女友准备了k个礼物,每个礼物有特定体积。若小礼物体积的两倍小于等于大礼物体积,小礼物可放入大礼物中,以减少快递费。问题求解如何安排礼物,使剩余未快递的礼物最少,并输出一种可行方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

打包礼物

Description

再过一段时间就是龙龙心心念念的她的生日,龙龙准备了 k 个礼物送给她,并且决定用顺丰快递寄过去。

但是龙龙发现,因为 k 太大了,所以要发很多个快递,这样就要很多的快递费。但是作为一个死肥宅,龙龙还要省点钱去买DELL的显示器、Cherry的机械键盘、NVIDA的最新煤气罐GTX2080呢……所以龙龙感觉钱不够了。

每一个礼物都被包装的明明白白,第 i 个礼物算上包装的体积就是 v 下標 i。龙龙发现,如果两个礼物的体积满足小礼物的体积的两倍不超过大礼物的体积,那么小礼物可以勉强塞在大礼物里。同时一个大礼物里最多只能塞一个其他小礼物,无论小礼物自己内部还有没有更小的礼物。如果小礼物被塞进大礼物里了,那么龙龙就不用再付小礼物的快递费了。请问龙龙应该如何安排硬塞一下,使得最后剩下的礼物数量最少?请输出方案。

Input

输入第一行有一个正整数 k,表示礼物的数量。

接下来一行共 k 个正整数,依次表示这些礼物的体积 vi。

Output

第一行输出一个正整数 p,表示安排后剩下的最少礼物数量。

接下来 p 行,每行开头输入一个正整数 t,表示这个礼物里被强行塞进去的礼物总数量。接下来输入 t 个数,从前到后依次表示这些礼物的编号,按照体积从小到大排序。

答案可能不唯一,输出任意一种合法方案即可。

Hint

对于样例,第一个盒子里体积是 {1,3},第二个盒子里体积是 {2,4},第三个盒子里体积是 {5}。答案不唯一,例如 {1,2,4}、{3}、{5} 的分法也可以。
所有数据保证1 ≤ k,vi ≤ 10^5。
请注意输出的不是礼物的体积,而是礼物的编号!

在这里插入图片描述

代码如下:

#include<stdio.h>  
#include<stdlib.h>  
struct present  
{
     
    int v;  
    int id;  
}   pre[100000];  
  
int a[100000][3];  
int comp(const void *p1, const void *p2)  
{
     
    struct present *c=(struct present*)p1;  
    struct present *d=(struct present*)p2;  
    return d->v-c->v;  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值