uva 11997 k个最小和(优先队列实现多路归并)题解

该博客介绍了如何使用优先队列解决UVA 11997问题,即从k个包含k个元素的数组中每次选取一个元素求和,找出前k小的和。博主通过多路归并策略来解决这个问题,并在文章中分享了具体的代码实现。需要注意的是,由于输出时多了一个空格,导致结果出现错误,博主提醒自己要记住这个教训。
摘要由CSDN通过智能技术生成

题意是k个包含k个元素的数组,从每个数组中取一个元素求和,求前k小的和

可以转化为多路归并,对k个表两两归并,最后输出结果

ps......多输出一个空格结果pe了.....以后要记住

代码如下:

#include<cstdio>  
#include<cstring>  
#include<cmath>  
#include<cstdlib>  
#include<iostream>  
#include<algorithm>  
#include<vector>  
#include<map>  
#include<queue>  
#include<stack> 
#include<string>
#include<map> 
using namespace std;  
#define LL long long  
const int maxn=750+10;


int A[maxn][maxn];

struct item{
	int s,b;
	bool operator < (const item& A) const{
		return s>A.s;
	}
};

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 tmp=q.top();q.pop();
		C[i]=tmp.s;
		int b=tmp.b;
		if(b+1<n) q.push((item){C[i]-B[b]+B[b+1],b+1});
	}	
}

int main(){
	//freopen("input.txt","r",stdin);
	int n;
	while(scanf("%d",&n)==1){
		for(int i=0;i<n;i++){
			for(int j=0;j<n;j++) scanf("%d",&A[i][j]);
			sort(A[i],A[i]+n);
		}
		for(int i=1;i<n;i++)
			merge(A[0],A[i],A[0],n);
		
		printf("%d",A[0][0]);
		for(int i=1;i<n;i++) printf(" %d",A[0][i]);
		printf("\n");
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值