UVA - 11997:K Smallest Sums

K Smallest Sums

来源:UVA

标签:数据结构、优先队列

参考资料:《算法竞赛入门经典训练指南》P189

相似题目:

题目

You’re given k arrays, each array has k integers. There are k 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.

输入

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).

输出

For each test case, print the k smallest sums, in ascending order.

输入样例

3
1 8 5
9 2 5
10 7 6
2
1 1
1 2

输出样例

9 10 12
2 2

解题思路

简化问题,假设现在只有两个长度为n的数组A和B,在A中和B中分别任取一个元素并相加,可以得到n²个和,求这些和中最小的n个。
对A中元素和B中元素排序。然后建立如下有序表:
表1:A[1]+B[1] <= A[1]+B[2] <= A[1]+B[3] <= … <= A[1]+B[n]
表2:A[2]+B[1] <= A[2]+B[2] <= A[2]+B[3] <= … <= A[2]+B[n]

表n:A[n]+B[1] <= A[n]+B[2] <= A[n]+B[3] <= … <= A[n]+B[n]
其中第a张表中的元素形如A[a]+B[b],以二元组(s, b)表示,其中s=A[a]+B[b]。当我们要得到表a中的下一个元素时(s’, b+1)时,只需要计算s’ =s-B[b]+B[b+1]。
按如下步骤,可以取出最小的n个和。
①每个表中取第一个元素放到优先队列中。
②取出优先队列中最小的元素,即为当前最小的和。
③取该元素的下一个元素放进优先队列中。
④重复②③步骤,直到已经取出n个和。
由于本题是多个数组,考虑多次进行如上操作,请理解代码。

参考代码

#include
#include
#include
#define MAXN 755
using namespace std;

struct Item{
	int s,b;
	Item(int _s,int _b):s(_s),b(_b){}
	bool operator < (const Item& rhs) const{
		return s>rhs.s;
	}
};
int arr[MAXN][MAXN];

void merge(int A[], int B[], int C[], int n){
	priority_queue<Item> q;
	for(int i=0;i<n;i++){
		q.push(Item(A[i]+B[0], 0));
	}	
	for(int i=0;i<n;i++){
		Item item=q.top(); q.pop();
		C[i]=item.s;
		int b=item.b;
		if(b+1<n) q.push(Item(item.s-B[b]+B[b+1], b+1)); 
	}
}

int main(){
	int n;
	while(~scanf("%d",&n)){
		for(int i=0;i<n;i++){
			for(int j=0;j<n;j++){
				scanf("%d",&arr[i][j]);
			}
			sort(arr[i],arr[i]+n);
		}
		
		for(int i=1;i<n;i++){
			merge(arr[0],arr[i],arr[0],n);
		}
		
		printf("%d",arr[0][0]);
		for(int i=1;i<n;i++){
			printf(" %d",arr[0][i]);
		}
		printf("\n");
	}
	return 0;
}

你可能感兴趣的:(【记录】算法题解)