POJ 2442 Sequence(优先队列)

题目链接

想了想 真没思路。。。然后搜一下题解,这个题解讲的很好。此问题是K路归并的加强版,K路归并好像听说过。对STL里的优先队列,不熟啊。。直接看的别人的代码,学习结构体的优先队列,还有开一个标记数组去记录。。。这样还错了好几次。。分析还是去看那个题解把。

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstdlib>
 4 #include <cstring>
 5 #include <cmath>
 6 #include <string>
 7 #include <queue>
 8 #include <vector>
 9 #include <algorithm>
10 using namespace std;
11 #define N 2001
12 int p[N],o[N];
13 struct node
14 {
15     int id;
16     int data;
17 };
18 struct cmp
19 {
20     bool operator()(const node &a,const node &b)
21     {
22         return a.data > b.data;
23     }
24 };
25 void judge(int m)
26 {
27     int temp[N],ans[N];
28     int i,te;
29     node t;
30     for(i = 1; i <= m; i ++)
31         temp[i] = 1;
32     priority_queue<node,vector<node>,cmp>que;
33     for(i = 1; i <= m; i ++)
34     {
35         t.data = p[i]+o[temp[i]];
36         t.id = i;
37         que.push(t);
38     }
39     i = 1;
40     te = m;
41     while(m--)
42     {
43         t = que.top();
44         ans[i++] = t.data;
45         que.pop();
46         t.data = p[t.id] + o[++temp[t.id]];
47         que.push(t);
48     }
49     m = te;
50     for(i = 1; i <= m; i ++)
51         p[i] = ans[i];
52 }
53 int main()
54 {
55     int n,m,i,j,t;
56     scanf("%d",&t);
57     while(t--)
58     {
59         scanf("%d %d",&n,&m);
60         for(i = 1; i <= m; i ++)
61             scanf("%d",&p[i]);
62         sort(p+1,p+m+1);
63         for(i = 2; i <= n; i ++)
64         {
65             for(j = 1; j <= m; j ++)
66                 scanf("%d",&o[j]);
67             sort(o+1,o+m+1);
68             judge(m);
69         }
70         for(i = 1; i <= m; i ++)
71         {
72             if(i == 1)
73                 printf("%d",p[i]);
74             else
75                 printf(" %d",p[i]);
76         }
77         printf("\n");
78     }
79     return 0;
80 }

 

posted @ 2013-01-17 14:50  Naix_x  阅读(202)  评论(0编辑  收藏  举报