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 }