打包礼物
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;