题目地址:POJ 2442
真心没想到这题的思路。。原来是从第一行逐步向下加,每次都只保存前n小的数。顺便练习了下堆。。不过感觉堆的这种用法用的不太多啊。。
又是手残。。把j写成了i,于是就改啊改。。改的跟题解上的几乎一样了= = !。。
代码如下:
#include <iostream> #include <cstdio> #include <string> #include <cstring> #include <stdlib.h> #include <math.h> #include <ctype.h> #include <queue> #include <map> #include <set> #include <algorithm> using namespace std; const int INF=0x3f3f3f3f; int q[3000], b[3000], sum[3000]; int main() { int t, n, m, i, j, x, tmp, k; scanf("%d",&t); while(t--) { scanf("%d%d",&m,&n); for(i=0;i<n;i++) { scanf("%d",&sum[i]); } sort(sum,sum+n); for(i=1;i<m;i++) { for(j=0;j<n;j++) { scanf("%d",&b[j]); } sort(b,b+n); for(j=0;j<n;j++) { q[j]=sum[0]+b[j]; } make_heap(q,q+n); for(j=1;j<n;j++) { for(k=0;k<n;k++) { tmp=sum[j]+b[k]; if(tmp>=q[0]) break; pop_heap(q,q+n); q[n-1]=tmp; push_heap(q,q+n); } } for(j=0;j<n;j++) { sum[j]=q[j]; } sort(sum,sum+n); } for(i=0;i<n-1;i++) { printf("%d ",sum[i]); } printf("%d\n",sum[n-1]); } return 0; }
POJ 2442 Sequence(堆的使用练习),布布扣,bubuko.com
原文地址:http://blog.csdn.net/scf0920/article/details/38382253