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 题目大意:给k个数组各含k个整数,求每个数组中取一个元素他们的和最小的前k个。
分析:一共有k的k次方个和,先看只有两个数组的情况(从小到大排好序的)
1 2 3 ...
1 A1+B1<=A1+B2<=A1+B3.....
2 A2+B1<=A2+B2<=A2+B3.....
...........................
若计算两两之和需k的平方次不可取(时间复杂度O(n的平方))
用优先队列找出最小的前k个和(时间复杂度O(nlogn))
由上面的表格知,第一行的k个元素在它所在列中是和最小的,但不是最小的前k个
把第一行的元素放入优先队列中,把队列的顶部元素提取出来,它是队列中最小的(A[a]+B[b])
也是两两之和中未被提取出来的最小的,把与它最相近的即比它大或等于它的(A[a]+B[b+1])
元素放入队列中。
以此类推提取出来的k个元素是最小的前k个。
两两数组合并从而求得最后结果。
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<queue>
using namespace std; const int Max=;
int A[Max][Max]; struct Item
{
int s,b;
Item() {}
Item(int s,int b):s(s),b(b) {}
bool operator < (const Item &a)const{
return a.s<s;
}
}item; void merge(int *A,int *B,int *C,int n)
{
priority_queue<Item> pq;
int i,b;
for(i=;i<n;i++) pq.push(Item(A[i]+B[],));
for(i=;i<n;i++)
{
item=pq.top();pq.pop();
C[i]=item.s;b=item.b;
if(b+<n) pq.push(Item(C[i]-B[b]+B[b+],b+));
}
}
int main()
{
int n,i,j;
while(~scanf("%d",&n))
{
for(i=;i<n;i++)
{
for(j=;j<n;j++) scanf("%d",&A[i][j]);
sort(A[i],A[i]+n);
}
for(i=;i<n;i++)
merge(A[],A[i],A[],n);
for(i=;i<n;i++) printf(i?" %d":"%d",A[][i]);
printf("\n");
}
return ;
}
uva 11997 优先队列的更多相关文章
- UVa 11997 (优先队列 多路归并) K Smallest Sums
		考虑一个简单的问题,两个长度为n的有序数组A和B,从每个数组中各选出一个数相加,共n2中情况,求最小的n个数. 将这n2个数拆成n个有序表: A1+B1≤A1+B2≤... A2+B1≤A2+B2≤. ... 
- UVA 11997 K Smallest Sums 优先队列 多路合并
		vjudge 上题目链接:UVA 11997 题意很简单,就是从 k 个数组(每个数组均包含 k 个正整数)中各取出一个整数相加(所以可以得到 kk 个结果),输出前 k 小的和. 这时训练指南上的一 ... 
- UVa 11997 K Smallest Sums     优先队列&&打有序表&&归并
		UVA - 11997 id=18702" target="_blank" style="color:blue; text-decoration:none&qu ... 
- UVa 11997 K Smallest Sums - 优先队列
		题目大意 有k个长度为k的数组,从每个数组中选出1个数,再把这k个数进行求和,问在所有的这些和中,最小的前k个和. 考虑将前i个数组合并,保留前k个和.然后考虑将第(i + 1)个数组和它合并,保留前 ... 
- UVA 11997 STL 优先队列
		题目链接: http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem ... 
- 优先队列 UVA 11997 K Smallest Sums
		题目传送门 题意:训练指南P189 分析:完全参考书上的思路,k^k的表弄成有序表: 表1:A1 + B1 <= A1 + B2 <= .... A1 + Bk 表2:A2 + B1 &l ... 
- uva 11997 K Smallest Sums  优先队列处理多路归并问题
		题意:K个数组每组K个值,每次从一组中选一个,共K^k种,问前K个小的. 思路:优先队列处理多路归并,每个状态含有K个元素.详见刘汝佳算法指南. #include<iostream> #i ... 
- UVA - 11997(巧妙的优先队列)
		题意: 有k个整数数组,各包含k个元素,在每个数组中取一个元素加起来,可以得到kk个和,求这些和中最小的k个值 解析: 从简单的情况开始分析:经典方法,对原题没有思路,那么分析问题的简化版 这是对于两 ... 
- Uva 11997 多路归并
		题目链接:https://uva.onlinejudge.org/external/119/11997.pdf 题意: k*k的矩阵,从每一行中选一个元素加起来,可以得到 kk个和,求前 k 个最小值 ... 
随机推荐
- (十三)maven之release和snapshots
			发布release 用户A将代码打包到RELEASE仓库.用户B使用时,需要在pom.xml添加jar包的依赖坐标.如果用户A将jar包版本从1.0升级到2.0,用户B使用时也需要在pom.xml中修 ... 
- 聊聊C语言和ABAP
			这个公众号之前的文章,分享的都是Jerry和SAP成都研究院的同事在工作中学到的一些知识和感受.而今天这篇文章,写作的由来是因为最近我又参与了SAP成都数字创新空间应聘者的面试,和一些朋友聊了一些关于 ... 
- Spring持久化之MyBatis
			MyBatis是一个优秀的轻量级持久化框架,本文主要介绍MyBatis与Spring集成的配置与用法. 1. Spring MyBatis配置 1.1 添加Maven依赖 在pom.xml文件里添加m ... 
- webpack4.x加vue模板文件简单还原vue-cli
			1.首先 npm init -y 创建一个项目 2.安装vue npm install vue --save 3.然后安装webpack 注意如果全局没有还要安装全局的webpack和webpack- ... 
- 初涉k-d tree
			听说k-d tree是一个骗分的好东西?(但是复杂度差评??? 还听说绍一的kdt常数特别小? KDT是什么 KDT的全称是k-degree tree,顾名思义,这是一种处理多维空间的数据结构. 例如 ... 
- ZJOI2018游记Round2
			Day0 趁着空档还溜回班上了一节物理课:瓢泼之中在9:00赶往余姚,车程3h+-- 中饭在一家饭馆,味道海星. 晚上和ykh,chj,xzt溜去吃一鸣和烧烤.一鸣不错,烧烤的话我因为口腔溃疡没怎么吃 ... 
- [POJ]1164 The Castle
			//markdown复制进来一堆问题 还是链接方便点 POJ 1164 The Castle 首先想到用9个方格来表示一个房间,如此一来复杂许多,MLE代码如下: //Writer:GhostCai ... 
- RN在设备上运行
			https://facebook.github.io/react-native/docs/running-on-device.html 在发布之前,最好是在真实的设备上测试一下应用.如果是通过crea ... 
- Vuex 实际使用中的一点心得 —— 一刷新就没了
			问题 在开发中,有一些全局数据,比如用户数据,系统数据等.这些数据很多组件中都会使用,我们当然可以每次使用的时候都去请求,但是出于程序员的"洁癖"."抠"等等优 ... 
- 《零基础入门学习Python》【第一版】视频课后答案第006讲
			python中被看作假:FALSE none 0 ‘ ’ " " ( ) [ ] { },其他一切都被解释为真 测试题答案: 0.Python 的 floor 除法现在使用 ... 
