poj 2442 Sequence

// 题意:有 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;
}

posted on 2012-03-14 14:39  sysu_mjc  阅读(300)  评论(0编辑  收藏  举报

导航