poj_2442_Sequence_堆
来源:互联网 发布:公务员网络大讲堂 编辑:程序博客网 时间:2024/06/05 14:29
题目大意
给定n组数,每组数有若干个数组,在每一个数组中取一个数然后构成新的数组,求新数组里的值的总和最小的前m个
思路
先将第一组数存到一个数组中,然后将后面数组中的数加上第一组数的第一个后存入堆中(全部数组按升序排列)然后枚举两个数组中的值,和堆顶进行判断,如果小于堆顶就把堆顶替换掉,最后将堆里的值覆盖掉第一个数组,继续操作直至全部处理完,输出堆中的值
O(n*n*logn)
#include <stdio.h>#include <queue>#include <algorithm>using namespace std;int arr1[1000000],arr2[1000000];bool cam(int x,int y){ return x<y;}priority_queue<long long> heap;int main(){ int n,m,x; scanf("%d",&x); for (int o=1;o<=x;o++) { scanf("%d%d",&n,&m); for (int i=1;i<=m;i++) scanf("%d",&arr1[i]); sort(arr1+1,arr1+m+1,cam); for (int i=2;i<=n;i++) { for (int j=1;j<=m;j++) scanf("%d",&arr2[j]); sort(arr2+1,arr2+m+1,cam); for (int j=1;j<=m;j++) { int ll=arr1[1]+arr2[j]; heap.push(arr1[1]+arr2[j]); } for (int j=2;j<=m;j++) { for (int k=1;k<=m;k++) { int t=arr1[j]+arr2[k]; if (t<heap.top()) { heap.pop(); heap.push(t); } else break; } } for (int j=1;j<=m;j++) { arr1[j]=heap.top(); heap.pop(); } sort(arr1+1,arr1+m+1,cam); } for (int i=1;i<=m;i++) printf("%d ",arr1[i]); printf("\n"); }}
1 0
- poj_2442_Sequence_堆
- 堆
- 堆
- 堆
- 堆
- 堆
- 堆
- 堆
- 堆
- 堆
- 堆
- 堆
- 堆
- 堆
- 堆
- 堆
- 堆
- 堆
- nodejs访问本地静态资源(进入index.html)
- iOS 笔记
- java日常笔记2016-12-09
- 电商手记-前站
- Pascal's Triangle
- poj_2442_Sequence_堆
- gulp入坑系列(1)——安装gulp
- hadoop学习第四节:HDFS
- tomcat中设置默认项目
- [BZOJ2959]长跑(lct+并查集)
- 修改laravel5.3的密码验证
- Linux(Ubuntu)下PostGIS+Postgresql的安装与配置(下)
- POJ 2236 Wireless Network 笔记
- 对DataTable进行过滤筛选的一些方法Select,dataview