UVA 11997 STL 优先队列
题目链接:
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 优先队列的更多相关文章
- UVA 11997 K Smallest Sums 优先队列 多路合并
vjudge 上题目链接:UVA 11997 题意很简单,就是从 k 个数组(每个数组均包含 k 个正整数)中各取出一个整数相加(所以可以得到 kk 个结果),输出前 k 小的和. 这时训练指南上的一 ...
- 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 ...
- UVa 11997 K Smallest Sums 优先队列&&打有序表&&归并
UVA - 11997 id=18702" target="_blank" style="color:blue; text-decoration:none&qu ...
- CJOJ 2484 函数最小值 / Luogu 2085 函数最小值(STL优先队列,堆)
CJOJ 2484 函数最小值 / Luogu 2085 函数最小值(STL优先队列,堆) Description 有n个函数,分别为F1,F2,...,Fn.定义 \(Fi(x)=Aix^2+Bix ...
- CJOJ 2482 【POI2000】促销活动(STL优先队列,大根堆,小根堆)
CJOJ 2482 [POI2000]促销活动(STL优先队列,大根堆,小根堆) Description 促销活动遵守以下规则: 一个消费者 -- 想参加促销活动的消费者,在账单下记下他自己所付的费用 ...
- 基于STL优先队列和邻接表的dijkstra算法
首先说下STL优先队列的局限性,那就是只提供入队.出队.取得队首元素的值的功能,而dijkstra算法的堆优化需要能够随机访问队列中某个节点(来更新源点节点的最短距离). 看似可以用vector配合m ...
- poj 3253 Fence Repair (STL优先队列)
版权声明:本文为博主原创文章,未经博主同意不得转载. vasttian https://blog.csdn.net/u012860063/article/details/34805369 转载请注明出 ...
- 合并果子(STL优先队列)
STL优先队列:priority_queue 定义:priority_queue<int>q; 从小到大:priority_queue<int,vector<int>,g ...
- UVa 11997 K Smallest Sums - 优先队列
题目大意 有k个长度为k的数组,从每个数组中选出1个数,再把这k个数进行求和,问在所有的这些和中,最小的前k个和. 考虑将前i个数组合并,保留前k个和.然后考虑将第(i + 1)个数组和它合并,保留前 ...
随机推荐
- http://www.html-js.com/article/2328
React.js编程思想 张小俊128 发布在使用React.js开发web应用2015年8月7日view:33385React 在文章任何区域双击击即可给文章添加[评注]!浮到评注点上可以查看详情. ...
- #数据结构-fib
/////////////////////////////////////////////////////////////////////////////// // // FileName : fic ...
- redis2.8--主从机同步流程
- Problem C 链表
Description 某部队进行新兵队列训练,将新兵从一开始按顺序依次编号,并排成一行横队,训练的规则如下:从头开始一至二报数,凡报到二的出列,剩下的向小序号方向靠拢,再从头开始进行一至三报数,凡报 ...
- DotNetBar v12.9.0.0 Fully Cracked
更新信息: http://www.devcomponents.com/customeronly/releasenotes.asp?p=dnbwf&v=12.9.0.0 如果遇到破解问题可以与我 ...
- 腾讯PK微软 王者之战一触即发
六一儿童节,曾在微信中热闹一时的智能机器人“小冰”被腾讯封杀.一场微软和腾讯的战争正式拉开帷幕.前者是PC时代的霸主,后者是中国移动互联网的王者.在此之前,类似的战争,腾讯曾经历无数次,从十年前的“珊 ...
- ansible quick start
1. ansible默认开启ControlPersist,也就是持续化ssh的socket连接,以跳过每次task都需要进行主机认证. 2. 但是centos的openssh版本太老了,不支持Cont ...
- 监听cell 滑动到 摸个分区
//滑动过程中 - (void)scrollViewDidScroll:(UIScrollView *)scrollView { // NSLog(@"000---%ld", ...
- iOS App上架流程(2016详细版
http://www.jianshu.com/p/b1b77d804254 iOS App上传项目遇到的问题 http://www.jianshu.com/p/9195cd991fc7
- Python 3.x print 小结
Python 思想: “一切都是对象!” input("Press Enter") 就可以让程序运行完后停一下 输出的 print 函数总结: 1. 字符串和数值类型可以直接输出 ...