POJ 2442 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 }