UVA——11997——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
#include <iostream>                                                  
#include <queue>                                                     
#include <cstring>                                                   
#include <cstdio>                                                    
#include <algorithm>                                                 
using namespace std;                                                 
const int M=800;                                                     
int a[M][M];                                                         
int k;                                                               
struct node                                                          
{                                                                    
	int sum;                                                            
	int n;                                                              
	friend bool operator<(node n1,node n2)                              
	{                                                                   
		return n1.sum>n2.sum;//表示把sum从小到大排序                       
	}                                                                   
};                                                                   
void merge(int *A,int *B)                                            
{                                                                    
	priority_queue<node>Q;                                              
	node temp;                                                          
	for(int i=0;i<k;i++)                                                
	{                                                                   
		temp.sum=A[i]+B[0];                                                
		temp.n=0;                                                          
		Q.push(temp);                                                      
	}                                                                   
	for(int i=1;i<k;i++)                                                
	{                                                                   
		node t=Q.top();  //每次都弹出Q中最小的数,放到A中                  
		Q.pop();                                                           
		A[i-1]=t.sum;                                                      
		t.sum=t.sum+B[t.n+1]-B[t.n];                                       
		t.n++;                                                             
		Q.push(t);                                                         
	}                                                                   
	A[k-1]=Q.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]);                                              
		}                                                                  
		printf("%d",a[0][0]);                                              
		for(int i=1;i<k;i++)                                               
		printf(" %d",a[0][i]);                                             
		printf("\n");                                                      
	}                                                                   
	return 0;                                                           
}                                                                    


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值