1. 程式人生 > >K Smallest Sums uva 11997(優先佇列 多路合併)

K Smallest Sums uva 11997(優先佇列 多路合併)

利用優先佇列,先求兩個陣列之間最小和,再迴圈求k次,只看隊首元素即可

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#define maxn 800
int a[maxn][maxn];
using namespace std;
struct node
{
    int sum,id;
    node(int sum,int id):sum(sum),id(id){}
    bool operator<(const node&a)const
    {
        return sum>a.sum;
    }
};
void merge(int *a,int *b,int *c,int n)
{
    priority_queue<node>q;
    for(int i=0;i<n;i++)
    q.push(node (a[i]+b[0],0));
    for(int i=0;i<n;i++)
    {
        node temp=q.top();
        q.pop();
        c[i]=temp.sum;
        if(temp.id+1<n)
        q.push(node(temp.sum-b[temp.id]+b[temp.id+1],temp.id+1));

    }

}
int main()
{int k;
while(~scanf("%d",&k))
{
    for(int i=0;i<k;i++)
    {for(int j=0;j<k;j++)
    scanf("%d",&a[i][j]);
    sort(a[i],a[i]+k);
    }
    for(int i=1;i<k;i++)
    merge(a[0],a[i],a[0],k);

    printf("%d",a[0][0]);
    for(int i=1;i<k;i++)
    printf(" %d",a[0][i]);
    printf("\n");

}
    return 0;
}