题目描述
给定m个序列,每个序列包含n个非负整数。现在我们可以从每个序列中选择一个数字以形成一个具有m个整数的序列。显然,我们可以得到n ^ m种这种序列。然后,我们可以计算每个序列中的数字总和,并获得n ^ m个值。我们需要的是最小的n个和。你可以帮我们吗?

题目大意:给定M个长度为N的序列,从每个序列中任意取一个数求和,可以构成N的M次方个和,求其中最小的N个和。

输入格式
第一行是整数T,它显示测试用例的数量,然后是T个测试用例。每种情况的第一行都包含两个整数m,n(0 <m <= 100,0 <n <= 2000)。以下m行分别表示m序列。序列中没有整数大于10000。

输出格式
对于每个测试用例,按升序打印具有最小n个和的行,并用空格隔开。

样例
样例输入
1
2 3
1 2 3
2 2 3
样例输出
3 3 4
数据范围与提示
POJ月刊,广林
题目分析
1.因为要求是打印前n小的,所以,我们可以给每一个序列先排个序
这样我们就可以累加每一个序列的首位,这个就是第一小的数,然后
我们就要找到第二小的
2.如果我们假设m=2;,则第二小的数在(a[2]+b[1)(a[1]+b[2])中,如果选择(a[2]+b[1])那么,第三小的在(a[3]+b[1]),(a[2]+b[2])(a[1]+b[2])中,。。。。
如果选择(a[k]+b[l],那么后面一小的在a[k+1]+b[l],a[k][l+1],与前面的剩余部分
最后求出以个长度n的序列,a,b便和并了,以同样的道理,和并一共m-1次
3.所以,我们可以建立一个小根堆,放入每一个要选择的和,每一次去取树根
4因为有重复的可能所以要用以个bool数组用巧妙的方法限制

#include<bits/stdc++.h>
using namespace std;
int Heap_size;
int n,m,T;
int a[2005],b[2005],c[2005];
struct ss{
int st1,st2,zs,pd;
}Heap[2005],st,aa;
void Put_heap(ss x)
{ Heap[++Heap_size]=x;
int now=Heap_size;
while(now>1&&Heap[now].zs<Heap[now>>1].zs)
{
swap(Heap[now],Heap[now>>1]);
now>>=1;
}
}
void Get_heap()
{
Heap[1]=Heap[Heap_size--];
int fa=1;
while(fa<=Heap_size/2)
{
int son=fa*2;
if(Heap_size>son&&Heap[son].zs>Heap[son+1].zs)
{
son++;
}
if(Heap[fa].zs>Heap[son].zs)
{
swap(Heap[fa],Heap[son]);
}
else
{
break;
}
fa=son;
} }
int main()
{
scanf("%d",&T);
while(T--)
{
scanf("%d %d",&m,&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
sort(a+1,a+1+n);
for(int i=1;i<m;i++)
{
Heap_size=0;
for(int j=1;j<=n;j++)
{
scanf("%d",&b[j]);
} sort(b+1,b+1+n); st.st1=1;
st.st2=1;
st.pd=0;
st.zs=a[1]+b[1];
Put_heap(st);
for(int j=1;j<=n;j++)
{
st=Heap[1];
Get_heap();
c[j]=st.zs;
if(!st.pd)
{ aa.st1=st.st1+1;
aa.st2=st.st2;
aa.pd=0;
aa.zs=a[aa.st1]+b[aa.st2];
Put_heap(aa);
aa.st1=st.st1;
aa.st2=st.st2+1;
aa.zs=a[aa.st1]+b[aa.st2];
aa.pd=1;
Put_heap(aa);
}
else
{
aa.st1=st.st1;
aa.st2=st.st2+1;
aa.pd=1;
aa.zs=a[aa.st1]+b[aa.st2];
Put_heap(aa);
}
}
for(int j=1;j<=n;j++) a[j]=c[j];
}
for(int i=1;i<=n;i++) printf("%d ",a[i]);
printf("\n"); } }

POJ 2442 Sequence堆 优先队列的更多相关文章

  1. POJ 2442 Sequence(堆的使用练习)

    题目地址:id=2442">POJ 2442 真心没想到这题的思路. .原来是从第一行逐步向下加,每次都仅仅保存前n小的数.顺便练习了下堆.. 只是感觉堆的这样的使用方法用的不太多啊. ...

  2. poj 2442 Sequence(优先队列)

    题目:http://poj.org/problem?id=2442 题意:给你n*m的矩阵,然后每行取一个元素,组成一个包含n个元素的序列,一共有n^m种序列, 让你求出序列和最小的前n个序列的序列和 ...

  3. poj 2442 Sequence (Priority Queue)

    2442 -- Sequence 真郁闷,明明方法是对的,为什么我的代码老是那么的慢._(:з」∠)_ 这题要想考虑两列的情况,然后逐列拓展. 代码如下: #include <cstdio> ...

  4. POJ 2442 - Sequence - [小顶堆][优先队列]

    题目链接:http://poj.org/problem?id=2442 Time Limit: 6000MS Memory Limit: 65536K Description Given m sequ ...

  5. POJ 2442 Sequence【堆】

    题目链接:http://poj.org/problem?id=2442 题目大意:给出一个m*n的矩阵,从每一行中取出一个数相加.能得到n^m个不同的结果.要求输出当中前n项. 建立一个以n元数组为底 ...

  6. POJ 2442 Sequence 优先队列

    题目: http://poj.org/problem?id=2442 #include <stdio.h> #include <string.h> #include <q ...

  7. POJ 2442 Sequence

    Pro. 1 给定k个有序表,取其中前n小的数字.组成一个新表,求该表? 算法: 由于  a1[1] < a1[2] < a1[3] ... <a1[n] a2[1] < a2 ...

  8. Sequence POJ - 2442

    Sequence POJ - 2442 口胡一个结论:就是前i行产生的最小的n个和,一定可以在"前i-1行产生的最小n个和,每一个加上这一行的任意一个数,产生的n2个数"中找到.( ...

  9. poj 3253 Fence Repair 优先队列

    poj 3253 Fence Repair 优先队列 Description Farmer John wants to repair a small length of the fence aroun ...

随机推荐

  1. 使用NSURLSessionDataTask实现大文件离线断点下载(完整)

    6.1 涉及知识点(1)关于NSOutputStream的使用 //1. 创建一个输入流,数据追加到文件的屁股上 //把数据写入到指定的文件地址,如果当前文件不存在,则会自动创建 NSOutputSt ...

  2. proxysql+MHA+半同步复制

    先配置成主从同步 先在各节点安装服务 [root@inotify ~]# yum install mariadb-server -y 编辑主节点的配置文件,并启动 [root@centos7 ~]# ...

  3. 【C/C++】习题3-7 DNA/算法竞赛入门经典/数组与字符串

    [题目] 输入m组n长的DNA序列,要求找出和其他Hamming距离最小的那个序列,求其与其他的Hamming距离总和. 如果有多个序列,求字典序最小的. [注]这道题是我理解错误,不是找出输入的序列 ...

  4. Spring Cloud Alibaba 整合 Nacos 实现服务配置中心

    在之前的文章 <Nacos 本地单机版部署步骤和使用> 中,大家应该了解了 Nacos 是什么?其中 Nacos 提供了动态配置服务功能 一.Nacos 动态配置服务是什么? 官方是这么说 ...

  5. Mysql实例 表设计

    目录 一.介绍 二.设计表格 三.查询 查都有哪些公司 查A公司都放了哪些广告 查A公司10月份该交多少广告费 四.分析 表结构设置 sql语句 其它功能 一.介绍 有一个公司叫月亮集团,他们旗下有很 ...

  6. 【dva】如何监听异步请求是否完成(页面loading)

    方案1.你可以在model里面操作 在model里面的state里面声明一个变量state,默认是false,effect函数执行开始就将其改为true,然后等call()然后结束后又将其改为fals ...

  7. python基础 (三)

    成员运算 判断某个个体在不在某个群体里,关键词:in(在),not in(不在)例如: 特殊的,如果是字典中,因为字典的V值是隐藏的,能查看的只有V,所以无法判断V值,只能判断K值. 身份运算 用于判 ...

  8. 为什么要用urlencode()函数进行url编码

    URLEncode就是将URL中特殊部分进行编码.URLDecoder就是对特殊部分进行解码. 因为当字符串数据以url的形式传递给web服务器时,字符串中是不允许出现空格和特殊字符的 譬如:你要传的 ...

  9. ios self.和_区别

    - "self."调用该类的setter或getter方法,"_"直接获取自己的实例变量.property 和 instance variable 是有区别的. ...

  10. HUST-计算机网络实验-socket编程

    随笔---HUST计网实验:socket编程 博主大三在读,第一次写随笔,水平有限,就当记录一下学习的过程,顺便面试前复习项目的时候看看. 实验要求: 编写一个 Web 服务器软件,要求如下: 基本要 ...