Problem K
K Smallest Sums
You're given k arrays, each array has k integers. There are kk ways to pick exactly one element in each array and calculate the sum of the integers. Your task is to find the k smallest sums among them.
Input
There will be several test cases. The first line of each case contains an integer k (2<=k<=750). Each of the following k lines contains k positive integers in each array. Each of these integers does not exceed 1,000,000. The input is terminated by end-of-file (EOF). The size of input file does not exceed 5MB.
Output
For each test case, print the k smallest sums, in ascending order.
Sample Input
3 1 8 5 9 2 5 10 7 6 2 1 1 1 2
Output for the Sample Input
9 10 12 2 2
题意呢就是有n*n个数字,没行取一个数字相加,求出前k个最小的和...
第一次用到了优先队列,很方便,可是一些小细节,排序啊,什么头文件等奇葩问题涌现,终于ak,还是很开心又学到一种方法,优先队列~
#include<cstdio>
#include<cstring>
#include <queue>
#include<iostream>
//#include <stdlib.h>
#include<algorithm>
using namespace std;
int n;
int a[755][755];
struct node
{
int sum,last;
node (int a,int b):sum(a),last(b){}
bool operator <(const node a)const
{
return sum>a.sum;
}
};
void ff(int *a,int *b)
{
priority_queue<node>que;
for (int i=0;i<n;i++)
que.push(node(a[i]+b[0],0));
for (int i=0;i<n;i++)
{
node k=que.top();
que.pop();
a[i]=k.sum;
k.sum=k.sum-b[k.last]+b[++k.last];
que.push(k);
}
}
int main()
{
int i,j;
while (~scanf("%d",&n))
{
for (i=0;i<n;i++)
{
for (j=0;j<n;j++)
scanf("%d",&a[i][j]);
sort(a[i],a[i]+n);
}
for (i=1;i<n;i++)
ff(a[0],a[i]);
for(int i=0;i<n;i++)
printf("%d%c",a[0][i],i==n-1?'\n':' ');
}
return 0;
}