题目链接:

http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=3148

题意:给K个数组,每个数组含有K个整数,从每个数组中各选一个数加起来,得到一个sum,这样的选法一共有K^k种,现在求这样的和中最小的K个sum.

解法:先考虑两个数组的情形

假设A1<=A2<=`````<=AK

B1<=B2<=`````<=Bk

则有

A1+B1<=A1+B2<=`````<=A1+Bk.

A2+B1<=A2+B2<=`````<=A2+Bk.

```````

Ak+B1<=Ak+B2<=`````<=Ak+Bk.

首先把第一列的数<s[i] = A[i] + B[1]     ,      1>,第一个数为和,第二个数为B的序号,放入优先队列,然后从优先队列中弹出最小的,这个最小值一定是所有和中最小的,同时压入A[a] + B[b+1],A[a]+B[b+1] = s-B[b]+B[b+1]....这样循环n次即可。得到了n个最小和。因为这里有k个数组,两两合并即可。

以上摘自刘汝佳的大白书190页。(是看了他的书写的,如果有错了不是他写错了,必然是我写错了)

贴代码:

 #include<cstdio>
#include<algorithm>
#include<queue>
using namespace std;
#define N 755
int k[N][N],n;
struct Item
{
int s,b;//s = A[a] + B[b]
Item(int s,int b):s(s),b(b) {}
bool operator<(const Item & other)const
{
return s > other.s;
}
};
void output(int a[])
{
printf("array :\n");
for(int i=; i<n; ++i)
printf("%d ",a[i]);
puts("");
}
void combine(int A[],int B[])
{
priority_queue<Item> q;
for(int i =; i<n; ++i)
q.push(Item(A[i]+B[] , ));
for(int i=; i<n; ++i)
{
Item item = q.top();
q.pop();
A[i] = item.s;
int b = item.b;
if(b+ < n ) q.push(Item(item.s - B[b] + B[b+] , b+));
}
}
int main()
{
// freopen("in.txt","r",stdin);
while(~scanf("%d",&n))
{
for(int i=; i<n; ++i)
{
for(int j=; j<n; ++j)
scanf("%d",&k[i][j]);
sort(k[i],k[i]+n);
}
for(int i=; i<n; ++i)
combine(k[],k[i]);
printf("%d",k[][]);
for(int i=; i < n; ++i)
printf(" %d",k[][i]);
puts("");
}
return ;
}

UVA 11997 STL 优先队列的更多相关文章

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

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

  2. UVA - 136 Ugly Numbers(丑数,STL优先队列+set)

    Ugly numbers are numbers whose only prime factors are 2, 3 or 5. The sequence 1, 2, 3, 4, 5, 6, 8, 9 ...

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

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

  4. CJOJ 2484 函数最小值 / Luogu 2085 函数最小值(STL优先队列,堆)

    CJOJ 2484 函数最小值 / Luogu 2085 函数最小值(STL优先队列,堆) Description 有n个函数,分别为F1,F2,...,Fn.定义 \(Fi(x)=Aix^2+Bix ...

  5. CJOJ 2482 【POI2000】促销活动(STL优先队列,大根堆,小根堆)

    CJOJ 2482 [POI2000]促销活动(STL优先队列,大根堆,小根堆) Description 促销活动遵守以下规则: 一个消费者 -- 想参加促销活动的消费者,在账单下记下他自己所付的费用 ...

  6. 基于STL优先队列和邻接表的dijkstra算法

    首先说下STL优先队列的局限性,那就是只提供入队.出队.取得队首元素的值的功能,而dijkstra算法的堆优化需要能够随机访问队列中某个节点(来更新源点节点的最短距离). 看似可以用vector配合m ...

  7. poj 3253 Fence Repair (STL优先队列)

    版权声明:本文为博主原创文章,未经博主同意不得转载. vasttian https://blog.csdn.net/u012860063/article/details/34805369 转载请注明出 ...

  8. 合并果子(STL优先队列)

    STL优先队列:priority_queue 定义:priority_queue<int>q; 从小到大:priority_queue<int,vector<int>,g ...

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

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

随机推荐

  1. (DFS)hdoj1241-Oil Deposit

    #include<cstdio> ][]; ][]={{,},{,-},{,},{-,},{,},{,-},{-,},{-,-}},cnt; void dfs(int x,int y) { ...

  2. C++-高效的swap

    原始版本: template<typename T> void swap(T& a, T& b) { T tmp(a); a = b; b = tmp; } 此版本不重视效 ...

  3. Quartz之CronExpression

    一 Cron Expression 的格式 Quartz的cronExpression见官网文档说明: http://www.docjar.com/docs/api/org/quartz/CronEx ...

  4. [处理器、单片机]ARM

    1.ARM简介: ARM是Advanced RISC Machines的缩写.1985年4月26日,第一个ARM原型在英国剑桥的Acorn计算机有限公司诞生,由美国加州San Jose VLSI技术公 ...

  5. LOGISTIC REGRESSION

    In logistic regression we learn a family of functions

  6. 云计算平台简介(App Engine)

    云计算平台简介(App Engine)     1   简介 App Engine: 应用程序引擎,是托管网络应用程序的云计算平台. 1.1  什么是云 云计算通常简称为“云”,是一种通过 Inter ...

  7. (转)SQLLite数据操作

    原文:http://dreamboy.blog.51cto.com/3180937/722352 SQLLite数据操作 一般数据采用的固定的静态数据类型,而SQLite采用的是动态数据类型,会根据存 ...

  8. 2016 - 1 - 20 runloop学习

    一:Runloop基本知识 1.本质就是运行循环 2.基本作用: 2.1保证程序持续运行 2.2处理APP中的各种事件:触摸,定时器,selector... 2.3节省CPU资源,系统程序性能:它会让 ...

  9. UIkit框架介绍

    UIKit Framework The UIKit framework (UIKit.framework) provides crucial infrastructure for implementi ...

  10. Squid代理之反向代理

    (一) 为Internet用户访问企业Web站点提供缓存加速. 1 关闭防火墙