• UVA11997 K Smallest Sums


    思路

    经典的k路归并问题

    问题先转换为2路的有序表归并

    先让A[1~k]都和B[1]相加,然后加入堆中,取出堆顶(A[x]+B[y])之后,再放入A[x]+B[y+1]

    代码

    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #include <queue>
    using namespace std;
    struct QNode{
        int val,s;
        bool operator < (const QNode &b) const{
            return val>b.val;
        }
    };
    priority_queue<QNode> q;
    void merge(int *a,int *b,int *c,int n){//合并A和B两个有序表   
        while(!q.empty())
            q.pop();
        for(int i=1;i<=n;i++)
            q.push((QNode){a[i]+b[1],1});
        for(int i=1;i<=n;i++){
            QNode x=q.top();
            while(x.s>n){
                q.pop();
                x=q.top();
            }
            q.pop();
            c[i]=x.val;
            q.push((QNode){x.val-b[x.s]+b[x.s+1],x.s+1});
        }
    }
    int A[2][800],k;
    int main(){
        freopen("test.in","r",stdin);
        freopen("test.out","w",stdout);
        while(scanf("%d",&k)==1){
            for(int i=1;i<=k;i++)
                scanf("%d",&A[0][i]);
            sort(A[0]+1,A[0]+k+1);
            for(int i=1;i<=k-1;i++){
                for(int j=1;j<=k;j++)
                    scanf("%d",&A[1][j]);
                sort(A[1]+1,A[1]+k+1);
                merge(A[0],A[1],A[0],k);
            }
            for(int i=1;i<=k;i++)
                printf("%d%c",A[0][i],(i==k)?'
    ':' ');
        }
        return 0;
    }
    
  • 相关阅读:
    将指定文件夹下所有图片转换成base64并返回数组
    SQL技巧
    yii 进行事务操作是不可以在一条sql里边放多条sql
    yii 直接执行sql
    按照特定方法排序
    表名为变量时的语法
    如何添加 actions
    触发器原理
    codeCeption 调试方法
    最长不下降子序列(LIS)
  • 原文地址:https://www.cnblogs.com/dreagonm/p/10681820.html
Copyright © 2020-2023  润新知