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 个最小值 ...
随机推荐
- 通过StringBuilder的reverse()实现倒序
import java.util.Scanner; public class ReverseString { public static void main(String[] args) { Scan ...
- Git强制pull
git fetch --all git reset --hard origin/master
- leetcode 127 单词接龙
给定两个单词(beginWord 和 endWord)和一个字典,找到从 beginWord 到 endWord 的最短转换序列的长度.转换需遵循如下规则: 每次转换只能改变一个字母. 转换过程中的中 ...
- elasticsearch最全详细使用教程:搜索详解
一.搜索API 1. 搜索API 端点地址从索引tweet里面搜索字段user为kimchy的记录 GET /twitter/_search?q=user:kimchy从索引tweet,user里面搜 ...
- 在idea下创建maven
之前一直用eclipse,现在要用idea写一个安装过程玩玩 一:New Project 二:选择maven,在project SDK上选择你安装的jdk,默认安装在c:/Program Files ...
- python matplotlib.pyplot对图像进行绘制
imshow()是对图像进行绘制 imshow()函数格式为: matplotlib.pyplot.imshow(X, cmap=None) X: 要绘制的图像或数组. cmap: 颜色图谱(colo ...
- CPP-基础:cout
C++编程语言互换流中的标准输出流,需要iostream.h支持.读为 "c out". 使用范例 //用户输入的数字由cin保存于变量a中,并通过cout输出. #include ...
- LeetCode || 大杂烩w
454. 4Sum II 题意:给四个数组,每个数组内取一个数使得四个数和为0,问有多少种取法 思路:枚举为On4,考虑两个数组,On2枚举所有可能的和,将和的出现次数存入map中,On2枚举另两个数 ...
- k8s master init and add node
目录 一. add google apt-key 二. k8s master init 三. k8s node add to master cluster(use this command when ...
- quartz测试类
package demo.mytest; import java.text.ParseException; import org.quartz.CronTrigger;import org.quart ...