Uva-11997-K Smallest Sums

来源:互联网 发布:devops正在扼杀程序员 编辑:程序博客网 时间:2024/04/19 21:17

题目要求是从k个数组中各选一个数组成的和中最小的k个。

用优先队列做,注意合并的时候可以做一些适当的优化操作,因为最开始已经对每个数组进行了排序,所以每一次更新只需要从当前优先队列中取出第一个数,然后进行更新操作即可。更新为删除当前相加的值,而加上当前值后面的一个值。

代码:

#include<cstdio>#include<cstring>#include<iostream>#include<queue>#include<algorithm>#define MAX 751using namespace std;struct node{    int sum;    int last;    node(int sum,int last):sum(sum),last(last){}    bool operator < (const node& a)const    {return sum>a.sum;    }};int a[MAX][MAX],k;void merge(int *a,int *b){    priority_queue<node> pq;    for(int i=0;i<k;i++)pq.push(node(a[i]+b[0],0));    for(int i=1;i<k;i++)    {node ita=pq.top();pq.pop();a[i-1]=ita.sum;ita.sum=ita.sum-b[ita.last]+b[++ita.last];pq.push(ita);    }    a[k-1]=pq.top().sum;}int main(){    while(scanf("%d",&k)!=EOF)    {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]);for(int i=0;i<k;i++)    printf("%d%c",a[0][i],i==k-1?'\n':' ');    }    return 0;}


原创粉丝点击