uva 11997
来源:互联网 发布:网络交流的利与弊英语 编辑:程序博客网 时间:2024/06/03 19:31
这是从刘汝佳训练指南上找的例题,值得学习的地方就是要养成把问题拆分然后再多路归并的好习惯,题目是要求从k组数据中任意取一个数找出然后选出其中和最小的k组数据,选择最小可以用优先队列很快实现,那么如何选择就应该想想选择呢?按书上思路就是先把问题分成只有两组数据时的情况,那么列式就变成:
A1+B1<A1+B2<A1+B3....
A2+B1<A2+B2<A3+B3....
.
AN+B1<AN+B2<AN+B3...
那么这样以来我们每次选出最优的就可以了,然后把其去掉再比较再选择就可以了。
#include<stdio.h>#include<stdlib.h>#include<queue>#include<algorithm>using namespace std;struct Item{ int s; int p; bool operator <(const Item&temp) const{ return s > temp.s; }};int a[800];int b[800];int k;void combine(int*A,int*B,int*C){ priority_queue<Item>q; for(int i=0;i<k;i++){ Item item; item.s=A[i]+B[0]; item.p=0; q.push(item); } for(int i=0;i<k;i++){ Item item; item=q.top(); q.pop(); A[i]=item.s; if(item.p+1<k){ item.s=item.s-B[item.p]+B[item.p+1]; item.p+=1; q.push(item); } }}int main(){ while(scanf("%d",&k)==1){ for(int i=0;i<k;i++)scanf("%d",&a[i]);//先读取第一排的数 sort(a,a+k); for(int i=1;i<k;i++){ for(int i=0;i<k;i++)scanf("%d",&b[i]);//读取后面k-1排的数 sort(b,b+k); combine(a,b,a); } printf("%d",a[0]); for(int i=1;i<k;i++)printf(" %d",a[i]); printf("\n"); } return 0;}
- UVA 11997
- uva 11997
- uva 11997
- uva 11997
- UVA - 11997(优先队列)
- uva 11997(priority_queue)
- uva
- UVA
- UVA
- UVA
- uva
- UVA
- UVA
- UVA
- UVA
- UVA
- UVA
- UVA
- UVa OJ 424大整数相加
- 「书评」SAP内存计算——HANA
- BeanUtils对Date和Decimal类型的转换器
- VC从文件中加载图片
- MFC与.net比较
- uva 11997
- xcode合并模拟器和真机静态库的编译
- Xfire调用webservice无法传递参数问题解决
- LBS打车定位系统
- java中RSA加解密的实现
- SAS学习笔记(二)
- Mac OS上编译Mobile VLC for ios
- 关于RSA算法密钥长度/密文长度/明文长度的介绍
- ASP.Net使用用户控件做公用分页控件