• Uva 11997 多路归并


    题目链接:https://uva.onlinejudge.org/external/119/11997.pdf

    题意:

    k*k的矩阵,从每一行中选一个元素加起来,可以得到 kk个和,求前 k 个最小值。

    分析:

    先把表头都放到优先队列中,每出一个,就从相应的表后面加一个。

     1 #include <bits/stdc++.h>
     2 
     3 using namespace std;
     4 
     5 const int maxn = 755;
     6 
     7 int A[maxn][maxn];
     8 
     9 struct Item {
    10     int s,b;
    11     bool operator < (const Item& rhs) const {
    12         return s > rhs.s;
    13     }
    14 };
    15 
    16 void merga(int* A,int* B,int* C,int n) {
    17     priority_queue<Item> Q;
    18     for(int i=0;i<n;i++) {
    19         Q.push((Item){A[i]+B[0],0});
    20     }
    21     
    22     for(int i=0;i<n;i++) {
    23         Item item = Q.top();Q.pop();
    24         C[i] = item.s;
    25         int b = item.b;
    26         if(b+1<n) Q.push((Item){item.s-B[b]+B[b+1],b+1});
    27     }
    28 }
    29 
    30 int main(int argc, char** argv) {
    31     int n;
    32     while(scanf("%d",&n)!=EOF) {
    33         for(int i=0;i<n;i++) {
    34             for(int j=0;j<n;j++) {
    35                 scanf("%d",&A[i][j]);
    36             }
    37             sort(A[i],A[i]+n);
    38         }
    39         
    40         for(int i=1;i<n;i++) {
    41             merga(A[0],A[i],A[0],n);
    42         }
    43         
    44         printf("%d",A[0][0]);
    45         for(int i=1;i<n;i++) {
    46             printf(" %d",A[0][i]);
    47         }
    48         puts("");
    49         
    50     }
    51     return 0;
    52 }
    View Code
  • 相关阅读:
    数据结构之c++感悟
    常见linux系统中RPM包的通用命名规则
    scripts
    http
    iscsi
    RHCE认证经典考题
    数据库
    配置空客户端邮件
    配置nfs服务
    Python版本的7大排序
  • 原文地址:https://www.cnblogs.com/TreeDream/p/6612196.html
Copyright © 2020-2023  润新知