POJ 2442 Sequence(堆)

Sequence

 

题意:给你n*m的矩阵,然后每行取一个元素,组成一个包含n个元素的序列,一共有n^m种序列,让你求出序列和最小的前n个序列的序列和。

 

思路:

1.将第一序列读入a向量中,并按升序排序。

2.将数据读入b向量中,并按升序排序。

    将a[0] + b[i] ( 0<=i<=n-1)读入p向量中

    建堆。

    然后b[1] + a[i] (0<=i<=n-1),如果b[1] + a[i]比堆p的顶点大,则退出,否则删除

    堆的顶点,插入b[1] + a[i]。然后是b[2],...b[n - 1]

3.将p的数据拷贝到a中,并对a按升序排序

4.循环2,3步,直到所有数据读入完毕。

5.打印a中的数据即为结果。

 

 1 #include <iostream>
 2 #include <algorithm>
 3 #include <queue>
 4 #include <stdio.h>
 5 using namespace std;
 6 
 7 void Solve()
 8 {
 9     int a[2010], b[2010];
10     int t;
11     int n, m;
12     priority_queue<int,deque<int>,less<int> >p;
13     scanf("%d", &t);
14     while(t--)
15     {
16         scanf("%d%d", &m, &n);
17         for(int i = 0; i < n; i++)
18             scanf("%d", &a[i]);
19         sort(a, a+n);
20         for(int i = 1; i < m; i++)
21         {
22             for(int j = 0; j < n; j++)
23             {
24                 scanf("%d", &b[j]);
25                 p.push(a[0]+b[j]);
26             }
27             sort(b, b+n);
28             for(int j = 1; j < n; j++)
29             {
30                 for(int k = 0; k < n; k++)
31                 {
32                     if(a[j]+b[k] > p.top())
33                         break;
34                     p.pop();
35                     p.push(a[j]+b[k]);
36                 }
37             }
38             for(int j = 0; j < n; j++)
39             {
40                 a[n-j-1] = p.top();
41                 p.pop();
42             }
43         }
44         for(int i = 0; i < n-1; i++)
45             printf("%d ", a[i]);
46         printf("%d\n", a[n-1]);
47     }
48 }
49 
50 int main(void)
51 {
52     Solve();
53 
54     return 0;
55 }
Sequence

 

posted @ 2013-12-23 21:33  GLSilence  阅读(182)  评论(0编辑  收藏  举报