zoukankan      html  css  js  c++  java
  • 堆 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("
    ");
    
        }
    
        return 0;
    }
  • 相关阅读:
    如何进行函数式编程
    HTML文本格式化
    非模态对话框的创建及注意事项
    中国第一代程序员列传
    野指针
    缓冲区溢出攻击
    windows全部启动项
    HTML 样式
    Volatile关键字
    HTML基本标签
  • 原文地址:https://www.cnblogs.com/cherryMJY/p/6145087.html
Copyright © 2011-2022 走看看