YYH的积木(NOIP模拟赛Round 6)
题目描述
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)的更多相关文章
- YYH的营救计划(NOIP模拟赛Round 6)
题目描述 “咚咚咚……”“查水表!”原来是查水表来了,现在哪里找这么热心上门的查表员啊!YYH感动的热泪盈眶,开起了门…… YYH的父亲下班回家,街坊邻居说YYH被一群陌生人强行押上了警车!YYH的父 ...
- YYH的球盒游戏(NOIP模拟赛Round 6)
题目描述 YYH有一些总共有种颜色的球,他有颜色的球个.他同样有个盒子,第个盒子能放个球. 他的目标是把这个球按规则放进个盒子里: 对于一个盒子,对于每种颜色的球至多只能放个. 把颜色为的球放进盒子, ...
- YYH的苍天大竹(NOIP模拟赛Round 6)
题目描述 YYH擅长种竹子.今天他收获了一根竹子,准备将这根柱子卖给CHS.这个竹子有n-1个竹节.CHS要求一定要从竹节的地方砍,而且砍成若干段后每一段竹子中最长的一小段竹子和最短的一小段的长度差不 ...
- YYH的王国(NOIP模拟赛Round 6)
题目描述 YYH拥有一个有n个城市的国家,编号为1~n.其中城市i到城市j的路径长度为i和j的最小公倍数.现在YYH想建一些高速公路,使得任意两座城市都能通过高速公路直接或间接到达.建造一条高速公路的 ...
- YYH算组合数(NOIP模拟赛Round 6)
题目描述 YYH手上有一个长度为N的数列,而且这个数列正好能表示为.现在他想知道这个数列的最大公约数是多少,请你帮帮他 输入输出格式 输入格式: 每个数据点包括多组数据,以EOF结束 对于每个数据输入 ...
- 水(NOIP模拟赛Round #10)
题目描述: 小Z有一个长度为的数列.他有次令人窒息的操作,每次操作可以使某个数字或.他当然是希望这些数字的乘积尽量小了.为了简化题目,你只需输出操作完成后的数列即可. ———————————————— ...
- 小红帽的画笔(NOIP模拟赛Round 7)
又到了神奇的模拟赛时间~ 真是丧~ 好吧我们来看看题目 小红帽是Pop star上最著名的人类画家,她可以将任何画出的东西变成真实的物品.赋予她这样神奇能力的正是她手上的画笔. 小红帽每次作画时,都需 ...
- 题(NOIP模拟赛Round #10)
题目描述: 有一张的地图,其中的地方是墙,的地方是路.有两种操作: 给出个地点,询问这个地点中活动空间最大的编号.若询问的位置是墙,则活动空间为:否则活动空间为询问地点通过四联通能到达的点的个数.如果 ...
- 大(NOIP模拟赛Round #10)
题目描述: 小Z有个n个点的高清大图,每个点有且只有一条单向边的出边.现在你可以翻转其中的一些边,使他从任何一个点都不能通过一些道路走回这个点.为了方便,你只需输出方案数对取模即可.当在两个方案中有任 ...
随机推荐
- Python9-数据类型-day3
数据类型转换 #int----->str s = 1 i = str(s) print(i) #str----->int s = ' i = int(s) print(i) #int--- ...
- Visual Stutio 2015激活密钥
Visual Stutio 2015 专业版激活密钥:HMGNV-WCYXV-X7G9W-YCX63-B98R2 Visual Stutio 2015 企业版激活密钥:HM6NR-QXX7C-DFW2 ...
- PAT (Basic Level) Practice 1023 组个最小数
个人练习 给定数字 0-9 各若干个.你可以以任意顺序排列这些数字,但必须全部使用.目标是使得最后得到的数尽可能小(注意 0 不能做首位).例如:给定两个 0,两个 1,三个 5,一个 8,我们得到的 ...
- [BZOJ2734][HNOI2012] 集合选数(状态压缩+思维)
Description 题目链接 Solution 可以根据条件构造出一个矩阵, 1 3 9 27 81... 2 6 18.... 4 12 36... 这个矩阵满足\(G[i][1]=G[i-1] ...
- Snowflake Snow Snowflakes【Poj3349】
Description You may have heard that no two snowflakes are alike. Your task is to write a program to ...
- 设计模式--单例模式Singleton
单例模式顾名思义整个程序下只有一个实例,例如一个国家只有一个皇帝,一个军队只有一个将军.单例模式的书写又分为饿汉模式和懒汉模式 饿汉模式 类中代码 package demo; public cla ...
- latex排版系统
proTeXt - MiKTeX-based distribution for Windows proTeXt aims to be an easy-to-install TeX distributi ...
- erlang节点局域网通信
节点1: F:\WorkSpace\Server\src>erl -name hw@192.168.10.142 -setcookie 4213 consulting .erlang in &q ...
- CTF python沙箱逃逸进阶题目
future引用了python3的新特性,所以是不能直接回回显,得用print file函数可以读取. print(().__class__.__bases__[0].__subclasses__() ...
- 搭建 MongoDB分片(sharding) / 分区 / 集群环境
1. 安装 MongoDB 三台机器 关闭防火墙 systemctl stop firewalld.service 192.168.252.121 192.168.252.122 192.168.25 ...