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 }
使用优先队列做:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 }