POJ_2442_Sequence(堆的应用)

http://poj.org/problem?id=2442

/*
题意:输入第一行为测试数据,
每一组测试数据有两个数,n、m;n代表接下来输入多少行,m代表每一行
有多少个数;让你计算从n行当中每一行取一个数相加得到的和那么会有n*m
个和。输出这些和当中前m小的。
题意理解之后关键是怎么做,这道题归为堆肯定是用堆来做的。
思路:对两行data1和data2进行操作,对两组数组进行排序
Q[i] = data2[0] + data1[i]
用make_heap对Q建堆。
然后data2[1] + data1[i] (0<=i<=n-1),如果data2[1] + data1[i]
比堆dataq的顶点大,则退出,否则删除堆的顶点,插入data2[1] + data1[i]。
然后是data2[2],...data2[n - 1]
*/

 1 # include <stdio.h>
 2 # include <iostream>
 3 # include <algorithm>
 4 using namespace std;
 5 const int MAXN=2013;
 6 int data1[MAXN],data2[MAXN],Q[MAXN];
 7 int main()
 8 {
 9     int tests,n,m,i,j,k;
10     scanf("%d",&tests);
11     while(tests--)
12     {
13         memset(data1,0,sizeof(data1));
14         scanf("%d%d",&n,&m);
15         for(i=0;i<m;i++)
16             scanf("%d",&data1[i]);
17         for(k=1;k<n;k++)
18         {
19             sort(data1,data1+m);
20             memset(data2,0,sizeof(data2));
21             
22             for(i=0;i<m;i++)  
23                 scanf("%d", &data2[i]);  
24             sort(data2,data2+m);
25             
26             for(i=0;i<m;i++)
27                 Q[i]=data1[0]+data2[i];
28             make_heap(Q,Q+m);
29             for(i=1;i<m;i++)
30             {
31                 for(j=0;j<m;j++)
32                 {
33                     int temp;
34                     temp=data1[i]+data2[j];
35                     if(temp <= Q[0])
36                     {
37                         pop_heap(Q,Q+m);
38                         Q[m-1]=temp;
39                         push_heap(Q,Q+m);
40                     }
41                 }
42             }    
43             for(int l=0;l<m;l++)
44                 data1[l]=Q[l];
45         }
46         sort(data1,data1+m);
47         for(i=0;i<m;i++)
48         {
49             if(i)printf(" ");
50             printf("%d",data1[i]);
51         }
52         printf("\n");
53     }
54     return 0;
55 }

 使用优先队列做:

 1 #include <iostream>
 2 #include <queue>
 3 #include <algorithm>
 4 using namespace std;
 5 const int maxn = 2000+10;
 6 int a[maxn], b[maxn];
 7 int main()
 8 {
 9     int T, n, m;
10     int i,j,k;
11     scanf("%d", &T);
12     while(T--) 
13     {
14         priority_queue<int> que;       
15         scanf("%d %d", &n, &m);        
16         for(i=0; i<m; i++)
17             scanf("%d", &a[i]);        
18         sort(a, a+m);
19         for(k=1; k<n; k++)
20         {
21             for(i=0; i<m; i++)        
22                 scanf("%d", &b[i]);
23             sort(b, b+m);         
24             for(i=0; i<m; i++)             
25                 que.push(a[0] + b[i]);
26             for(i=1; i<m; i++)
27             {
28                 for(int j=0; j<m; j++)
29                 {
30                     if(a[i] + b[j] > que.top())
31                         break;
32                     que.pop();
33                     que.push(a[i]+b[j]);
34                 }
35             }          
36             for(i=m-1; i>=0; i--) 
37             {
38                 a[i] = que.top();
39                 que.pop();
40             }
41         }
42         for(i=0; i<m; i++)
43         {
44             if(i != m-1) printf("%d ", a[i]);
45             else printf("%d", a[i]);
46         }
47         putchar('\n');
48     }
49     return 0;
50 }
View Code

 

posted on 2013-08-21 16:47  随风浪子的博客  阅读(98)  评论(0编辑  收藏  举报

导航