poj 2442 Sequence
2012-03-14 14:39
393 查看
// 题意:有 m个序列,每个序列 n个元素,从每个序列中选择一个元素组成一个数并计算和, // 总共有 n^m 个和,输出最小的 n个和 // 思路:用STL的堆解决,将第一个序列读入arr1中,升序排序;将第二个序列读入arr2中,升序排序 // 将arr2[0]+arr1[0...n]读入heap,之后建大顶堆 make_heap(heap,heap+n); // 其后,对于i=1...n-1,将t=arr2[i]+arr1[0...n]与堆顶作比较,若小于堆顶,则删除原堆顶结点,并将t压入,否则退出 // 把heap复制到arr1数组并排序,这样arr1 就保存着当前最小的n个和.再继续以上过程. #include <iostream> #include <algorithm> using namespace std; int arr1[2002],arr2[2002],heap[2002]; int main() { int cases,n,m; cin>>cases; while(cases--) { cin>>m>>n; for(int i=0;i<n;++i) cin>>arr1[i]; sort(arr1,arr1+n); while(--m) { for(int i=0;i<n;++i) cin>>arr2[i]; sort(arr2,arr2+n); for(int i=0;i<n;++i) heap[i]=arr1[i]+arr2[0]; make_heap(heap,heap+n); for(int i=1;i<n;++i) { int go_on=0; for(int j=0;j<n;++j) { int t=arr2[i]+arr1[j]; if(t<heap[0]) { pop_heap(heap,heap+n); heap[n-1]=t; push_heap(heap,heap+n); go_on=1; } else break; } if(!go_on) break; } for(int i=0;i<n;++i) arr1[i]=heap[i]; sort(arr1,arr1+n); } for(int i=0;i<n;++i) cout<<arr1[i]<<" "; cout<<endl; } return 0; }
相关文章推荐
- POJ-2442-Sequence
- POJ 2442 Sequence
- POJ - 2442 Sequence(优先队列/堆)
- poj 2442 Sequence(优先队列)
- poj 2442 Sequence(贪心,堆)
- poj_2442_Sequence_堆
- POJ 2442 Sequence
- poj 2442 Sequence
- 【POJ 2442】Sequence
- POJ 2442 Sequence
- POJ 2442 Sequence【堆】
- POJ 2442 Sequence (堆)
- POJ 2442 Sequence (手写堆)
- POJ 2442 Sequence(stl+优先队列||堆)
- POJ 2442 Sequence 堆
- 【优先队列】:poj2442,Sequence
- poj2442---Sequence
- poj 2442 Sequence
- poj 2442 Sequence 堆