题目传送门

题意:训练指南P189

分析:完全参考书上的思路,k^k的表弄成有序表:

表1:A1 + B1 <= A1 + B2 <= .... A1 + Bk

表2:A2 + B1 <= A2 + B2 <= ...  A2 + Bk

.......

表k:Ak + B1 <= Ak + B2 <= ...  Ak + Bk

可以维护一个k长度的数组表示当前的前k小的数字和,当第i行的数组读入时,先push第一个,也就是最小的,然后可以更新成第二个,就是 - B[i] + B[i+1].利用优先队列的logn的性质能很好的得到每个时刻的最小值,总的复杂度变成nlogn

#include <bits/stdc++.h>
using namespace std; const int N = 750 + 5;
int a[N][N];
int n;
struct P {
int v, id;
P() {}
P(int v, int id) : v (v), id (id) {}
bool operator < (const P&r) const {
return v > r.v;
}
}; void get_sum(int *A, int *B, int *C) {
priority_queue<P> pque;
for (int i=1; i<=n; ++i) {
pque.push (P (A[i] + B[1], 1));
}
for (int i=1; i<=n; ++i) {
P r = pque.top (); pque.pop ();
C[i] = r.v;
int id = r.id;
if (r.id < n) pque.push (P (r.v - B[id] + B[id+1], id+1));
}
} int main(void) {
while (scanf ("%d", &n) == 1) {
for (int i=1; i<=n; ++i) {
for (int j=1; j<=n; ++j) {
scanf ("%d", &a[i][j]);
}
sort (a[i]+1, a[i]+1+n);
}
for (int i=2; i<=n; ++i) {
get_sum (a[1], a[i], a[1]);
}
for (int i=1; i<=n; ++i) {
printf ("%d%c", a[1][i], i == n ? '\n' : ' ');
}
} return 0;
}

  

优先队列 UVA 11997 K Smallest Sums的更多相关文章

  1. UVa 11997 K Smallest Sums 优先队列&amp;&amp;打有序表&amp;&amp;归并

    UVA - 11997 id=18702" target="_blank" style="color:blue; text-decoration:none&qu ...

  2. UVA 11997 K Smallest Sums 优先队列 多路合并

    vjudge 上题目链接:UVA 11997 题意很简单,就是从 k 个数组(每个数组均包含 k 个正整数)中各取出一个整数相加(所以可以得到 kk 个结果),输出前 k 小的和. 这时训练指南上的一 ...

  3. UVa 11997 K Smallest Sums - 优先队列

    题目大意 有k个长度为k的数组,从每个数组中选出1个数,再把这k个数进行求和,问在所有的这些和中,最小的前k个和. 考虑将前i个数组合并,保留前k个和.然后考虑将第(i + 1)个数组和它合并,保留前 ...

  4. uva 11997 K Smallest Sums 优先队列处理多路归并问题

    题意:K个数组每组K个值,每次从一组中选一个,共K^k种,问前K个小的. 思路:优先队列处理多路归并,每个状态含有K个元素.详见刘汝佳算法指南. #include<iostream> #i ...

  5. 【UVA 11997 K Smallest Sums】优先级队列

    来自<训练指南>优先级队列的例题. 题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=18702 题意:给定 ...

  6. 【UVA–11997 K Smallest Sums 】

    ·哦,这题要用优先队列?那大米饼就扔一个手写堆上去吧! ·英文题,述大意:       输入n个长度为n的序列(题中是k,2<=k<=750).一种结果定义为:从每个序列中都要挑选一个数加 ...

  7. UVA 11997 K Smallest Sums (多路归并)

    从包含k个整数的k个数组中各选一个求和,在所有的和中选最小的k个值. 思路是多路归并,对于两个长度为k的有序表按一定顺序选两个数字组成和,(B表已经有序)会形成n个有序表 A1+B1<=A1+B ...

  8. 11997 - K Smallest Sums(优先队列)

    11997 - K Smallest Sums You’re given k arrays, each array has k integers. There are kk ways to pick ...

  9. UVa 11997 (优先队列 多路归并) K Smallest Sums

    考虑一个简单的问题,两个长度为n的有序数组A和B,从每个数组中各选出一个数相加,共n2中情况,求最小的n个数. 将这n2个数拆成n个有序表: A1+B1≤A1+B2≤... A2+B1≤A2+B2≤. ...

随机推荐

  1. Linux Window Redis安装

    Linux 下简易的安装过程: 1.源码安装之前要先安装gcc,不然编译会出错, 2.下载源码,去http://download.redis.io/releases/这个文件夹内找想安装的版本,我下载 ...

  2. Oracle读写分离架构

    读写分离是架构分布式系统的一个重要思想.不少系统整体处理能力并不能同业务的增长保持同步,因此势必会带来瓶颈,单纯的升级硬件并不能一劳永逸.针对业务类型特点,需要从架构模式上进行一系列的调整,比如业务模 ...

  3. Java大数处理类:BigInteger类和BigDecimal类

    当我们要处理非常大的数据时,平常用的数据类型已不足以表示,在Java中有两个类BigInteger和BigDecimal分别表示大整数类和大浮点数类,这两个类在理论上只要计算机内存足够大就能够表示无线 ...

  4. NYOJ题目874签到

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAswAAAIzCAIAAACbd9iBAAAgAElEQVR4nO3dPXLjSNou0G8T8rUQ2V

  5. 二、JavaScript语言--JS实践--倒计时效果

    主要内容:分析不同倒计时效果的计算思路及方法,掌握日期对象Date,获取时间的方法,计算时差的方法,实现不同的倒时计效果. Javascript 日期对象: Date()返回当前的日期和时间 getY ...

  6. php 关联数据库的留言板练习

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  7. Jcapta

    http://blog.csdn.net/shadowsick/article/details/8575471

  8. 与你相遇好幸运,CentOS 7 x86_64使用Yum安装PostgreSQL

    访问http://yum.pgrpms.org/reporpms/repoview/letter_p.group.html,下载并安装和当前系统对应的rpm文件. wget https://downl ...

  9. PHP获取远程图片并调整图像大小(转)

    <?php /** * *函数:调整图片尺寸或生成缩略图 *修改:2013-2-15 *返回:True/False *参数: * $Image 需要调整的图片(含路径) * $Dw=450 调整 ...

  10. JavaWeb学习之tomcat安装与运行、tomcat的目录结构、配置tomcat的管理用户、web项目目录、虚拟目录、虚拟主机(1)

    1.tomcat安装与运行双击tomcat目录下的bin/startup.bat,启动之后,输入http://localhost:8080,出现安装成功的提示,表示安装tomcat成功 2.tomca ...