Uva-11997-K Smallest Sums
来源:互联网 发布:devops正在扼杀程序员 编辑:程序博客网 时间:2024/04/19 21:17
题目要求是从k个数组中各选一个数组成的和中最小的k个。
用优先队列做,注意合并的时候可以做一些适当的优化操作,因为最开始已经对每个数组进行了排序,所以每一次更新只需要从当前优先队列中取出第一个数,然后进行更新操作即可。更新为删除当前相加的值,而加上当前值后面的一个值。
代码:
#include<cstdio>#include<cstring>#include<iostream>#include<queue>#include<algorithm>#define MAX 751using namespace std;struct node{ int sum; int last; node(int sum,int last):sum(sum),last(last){} bool operator < (const node& a)const {return sum>a.sum; }};int a[MAX][MAX],k;void merge(int *a,int *b){ priority_queue<node> pq; for(int i=0;i<k;i++)pq.push(node(a[i]+b[0],0)); for(int i=1;i<k;i++) {node ita=pq.top();pq.pop();a[i-1]=ita.sum;ita.sum=ita.sum-b[ita.last]+b[++ita.last];pq.push(ita); } a[k-1]=pq.top().sum;}int main(){ while(scanf("%d",&k)!=EOF) {for(int i=0;i<k;i++){ for(int j=0;j<k;j++)scanf("%d",&a[i][j]); sort(a[i],a[i]+k);}for(int i=1;i<k;i++) merge(a[0],a[i]);for(int i=0;i<k;i++) printf("%d%c",a[0][i],i==k-1?'\n':' '); } return 0;}
- UVa - 11997 - K Smallest Sums
- UVa - 11997 - K Smallest Sums
- Uva-11997-K Smallest Sums
- UVA 11997 K Smallest Sums
- UVA 11997 K Smallest Sums
- UVA 11997 K Smallest Sums
- UVa - 11997 - K Smallest Sums
- UVA 11997 K Smallest Sums
- UVA 11997 K Smallest Sums
- UVA 11997 K Smallest Sums
- uva 11997 - K Smallest Sums
- UVa 11997 K Smallest Sums
- UVA - 11997 K Smallest Sums
- UVa 11997 K Smallest Sums
- UVA 11997 K Smallest Sums
- Uva 11997 - K Smallest Sums
- UVa 11997 K Smallest Sums
- UVA-11997 K Smallest Sums
- 修旱冰场
- listview加载性能优化ViewHolder
- windows phone:数据绑定(二)
- Linux下查看Apache和tomcat的请求数
- How to Transact Move Order in WMS Enabled Organization
- Uva-11997-K Smallest Sums
- 3个著名加密算法(MD5、RSA、DES)的解析
- java中四种静态内部类总结(仅供参考)
- PPI是什么?pixels per inch像素密度是什么?PPI如何计算?
- 这些年,我收集的JavaScript代码(一)
- php冒泡排序
- poj 3522 Slim Span (Kruskal+枚举)
- 用css控制标题字符溢出,用省略号表示
- 本次操作由于这台计算机的限制而被取消