堆 poj 2442
t组数据
n m
给 n*m的矩阵
从每行拿出一个数 可有n^m个组合
求前n小的输出
维护前n小的数组
#include<stdio.h> #include<string.h> #include<algorithm> #include<vector> using namespace std; #define MAXN 100010 struct node//手写个堆 大顶堆 { int Size; int z[MAXN]; void clear() { Size=0; memset(z,0,sizeof(z)); } bool empty() { return Size?0:1; } void shift_up(int a) { while(a>1) { if(z[a]>z[a>>1]) { swap(z[a],z[a>>1]); a=a>>1; } else break; } } void shift_down(int a) { while((a<<1)<=Size) { int b=a<<1; if(b<Size&&z[b]<z[b+1]) b++; if(z[a]<z[b]) { swap(z[a],z[b]); a=b; } else break; } } int top() { return z[1]; } void pop() { swap(z[1],z[Size]); Size--; shift_down(1); } void push(int a) { z[++Size]=a; shift_up(Size); } }; int main() { int t; scanf("%d",&t); while(t--) { int n,m; scanf("%d%d",&n,&m); vector<int>a,b; node Q; a.clear(); b.clear(); Q.clear(); for(int i=0;i<m;i++) { int w; scanf("%d",&w); a.push_back(w); } sort(a.begin(),a.end()); for(int i=1;i<n;i++) { b.clear(); for(int j=0;j<m;j++) { int w; scanf("%d",&w); b.push_back(w); } sort(b.begin(),b.end()); for(int j=0;j<m;j++) //显然b[0]是一定要放的 Q.push(b[0]+a[j]); for(int j=1;j<m;j++) { for(int k=0;k<m;k++) //然后维护一下就好了 { if(b[j]+a[k]>Q.top()) break; else { Q.pop(); Q.push(b[j]+a[k]); } } } for(int j=0;j<m;j++) { a[m-1-j]=Q.top(); Q.pop(); } } for(int i=0;i<m;i++) printf("%d ",a[i]); printf("\n"); } return 0; }
posted on 2016-12-08 15:22 HelloWorld!--By-MJY 阅读(139) 评论(0) 编辑 收藏 举报