K Smallest Sums uva 11997(優先佇列 多路合併)
阿新 • • 發佈:2018-12-15
利用優先佇列,先求兩個陣列之間最小和,再迴圈求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; }