题目描述

YYH手上有n盒积木,每个积木有个重量。现在他想从每盒积木中拿一块积木,放在一起,这一堆积木的重量为每块积木的重量和。现在他想知道重量最少的k种取法的重量分别是多少。

输入输出格式

输入格式:

第一行输入一个整数T,表示有T组数据

每组数据的第一行输入两个整数,n,k,意义如题目所描述。

每组数据接下来的n行,第一个整数为mi,表示第i盒积木的数量,在同一行有mi个整数,分别表示每个积木的重量

输出格式:

输出T行,分别为每组数据的答案

首先我们看到这道题的范围,就发现这是一道神奇的题目

DP?那么必须要滚动数组存储状态,不然肯定MLE,

还有没有更简单的做法?

很明显,我们需要维护一个数列的最小的前k个数,有没有什么奇特的数据结构可以帮到我们?

事实上是有的:

TOP1:堆

TOP2:优先队列。

显然,在代码长度允许的情况下,我们肯定选择好打的,(事实证明优先队列会TLE?)

我们将一个盒子的每一个数加上原来的状态(这里需要用到滚动数组存储状态)放入一个堆中,然后如果堆中已有k个元素,就判断是否比最后一个元素大,如果更大,那么就pop第一个元素,再将这个数push进去

然后就能飞快的做出答案啦!

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int h[][],len[],num[];
int n,k,t,f,m;
bool cmp(int a,int b){return a<b;}
int main(){
scanf("%d",&t);
for(int i=;i<=t;i++)
{
memset(h,,sizeof(h));
len[]=;f=;
scanf("%d%d",&n,&k);
for(int j=;j<=n;j++)
{
len[(f^=)]=;
scanf("%d",&m);
for(int kq=;kq<=m;kq++)
{
scanf("%d",&num[kq]);
for(int l=;l<=len[f^];l++)
{
int tmp=num[kq]+h[f^][l];
if(len[f]<k)
{
h[f][++len[f]]=tmp;
push_heap(h[f]+,h[f]+len[f]+,cmp);
}
else if(h[f][]>tmp)
{
pop_heap(h[f]+,h[f]+len[f]+,cmp);
h[f][len[f]]=tmp;
push_heap(h[f]+,h[f]+len[f]+,cmp);
}
}
}
}
sort(h[f]+,h[f]+len[f]+);
for(int i=;i<=k;i++)
{
printf("%d%c",h[f][i],(i==k)?'\n':' ');
}
}
return ;
}

YYH的积木(NOIP模拟赛Round 6)的更多相关文章

  1. YYH的营救计划(NOIP模拟赛Round 6)

    题目描述 “咚咚咚……”“查水表!”原来是查水表来了,现在哪里找这么热心上门的查表员啊!YYH感动的热泪盈眶,开起了门…… YYH的父亲下班回家,街坊邻居说YYH被一群陌生人强行押上了警车!YYH的父 ...

  2. YYH的球盒游戏(NOIP模拟赛Round 6)

    题目描述 YYH有一些总共有种颜色的球,他有颜色的球个.他同样有个盒子,第个盒子能放个球. 他的目标是把这个球按规则放进个盒子里: 对于一个盒子,对于每种颜色的球至多只能放个. 把颜色为的球放进盒子, ...

  3. YYH的苍天大竹(NOIP模拟赛Round 6)

    题目描述 YYH擅长种竹子.今天他收获了一根竹子,准备将这根柱子卖给CHS.这个竹子有n-1个竹节.CHS要求一定要从竹节的地方砍,而且砍成若干段后每一段竹子中最长的一小段竹子和最短的一小段的长度差不 ...

  4. YYH的王国(NOIP模拟赛Round 6)

    题目描述 YYH拥有一个有n个城市的国家,编号为1~n.其中城市i到城市j的路径长度为i和j的最小公倍数.现在YYH想建一些高速公路,使得任意两座城市都能通过高速公路直接或间接到达.建造一条高速公路的 ...

  5. YYH算组合数(NOIP模拟赛Round 6)

    题目描述 YYH手上有一个长度为N的数列,而且这个数列正好能表示为.现在他想知道这个数列的最大公约数是多少,请你帮帮他 输入输出格式 输入格式: 每个数据点包括多组数据,以EOF结束 对于每个数据输入 ...

  6. 水(NOIP模拟赛Round #10)

    题目描述: 小Z有一个长度为的数列.他有次令人窒息的操作,每次操作可以使某个数字或.他当然是希望这些数字的乘积尽量小了.为了简化题目,你只需输出操作完成后的数列即可. ———————————————— ...

  7. 小红帽的画笔(NOIP模拟赛Round 7)

    又到了神奇的模拟赛时间~ 真是丧~ 好吧我们来看看题目 小红帽是Pop star上最著名的人类画家,她可以将任何画出的东西变成真实的物品.赋予她这样神奇能力的正是她手上的画笔. 小红帽每次作画时,都需 ...

  8. 题(NOIP模拟赛Round #10)

    题目描述: 有一张的地图,其中的地方是墙,的地方是路.有两种操作: 给出个地点,询问这个地点中活动空间最大的编号.若询问的位置是墙,则活动空间为:否则活动空间为询问地点通过四联通能到达的点的个数.如果 ...

  9. 大(NOIP模拟赛Round #10)

    题目描述: 小Z有个n个点的高清大图,每个点有且只有一条单向边的出边.现在你可以翻转其中的一些边,使他从任何一个点都不能通过一些道路走回这个点.为了方便,你只需输出方案数对取模即可.当在两个方案中有任 ...

随机推荐

  1. 4525: [Cerc2012]Kingdoms

    4525: [Cerc2012]Kingdoms 题意 n个国家,两两之间可能存在欠债或者被欠债的关系,一个国家破产:其支出大于收入.问一个国家能否坚持到最后. 思路 很有意思的一道题. dp[s]表 ...

  2. P1800 software_NOI导刊2010提高(06)(二分答案)

    P1800 software_NOI导刊2010提高(06) 题目描述 一个软件开发公司同时要开发两个软件,并且要同时交付给用户,现在公司为了尽快完成这一任务,将每个软件划分成m个模块,由公司里的技术 ...

  3. Java重写与重载

    重写的规则: 参数列表必须完全与被重写方法的相同: 返回类型必须完全与被重写方法的返回类型相同: 访问权限不能比父类中被重写的方法的访问权限更低.例如:如果父类的一个方法被声明为public,那么在子 ...

  4. 部署 CA 和 NPS 服务器证书

    TechNet 库 Windows Server Windows Server 2008 R2 und Windows Server 2008 按类别提供的 Windows Server 内容 按类别 ...

  5. shell判断文件是否存在[转]

    原文出处: http://canofy.iteye.com/blog/252289 shell判断文件,目录是否存在或者具有权限 #!/bin/sh myPath="/var/log/htt ...

  6. Pascal “熊猫烧香”(骗人的)

    Pascal仿熊猫烧香病毒,慎用 program japussy;useswindows, sysutils, classes, graphics, shellapi{, registry};cons ...

  7. c语言版贪吃蛇小游戏

    编译环境:windows 7 64位 编译工具:codeblocks 13.12 备注:未使用graphics.h 声明:个人原创,未经允许,禁止转载!!! 数据结构:双向链表 1.程序未使用grap ...

  8. sharePreference的几个重点

    一.  SharePreferences是用来存储一些简单配置信息的一种机制,使用Map数据结构来存储数据,以键值对的方式存储,采用了XML格式将数据存储到设备中,文件存放在/data/data/&l ...

  9. php session 测试

    2018-06-22 08:26:30 session指的是默认php提供的文件session形式 当前我的认识是,php并不记录session的过期时间,但是php.ini中有session的垃圾回 ...

  10. 一些需要注意的ts

    写了一段时间ts,在从头学习一遍,温故而之新 ts的一些技巧 1.巧用注释 通过/** */形式的注释可以给 TS 类型做标记,编辑器会有更好的提示: /** A cool guy. */ inter ...