堆 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编辑  收藏  举报

导航