一、题解方法
主要是利用stl库中的make_heap,堆排序。
声明三个数组:
- sum[MAX]: 存放读取到当前序列前的最小和
- data[MAX]: 存放当前序列的n个值
- Q[MAX]: 计算比较的临时序列,最后会赋值给sum数组。
运算步骤:
读取当前序列中的n个值,分别和sum数组中的第一项加和,存入Q数组,利用make_heap建堆。
接着将这n个值和sum数组中的其他项加和,结果和最大堆中最大元素比较,若比最大元素小,则当前最大元素踢出堆,结果存入Q数组,重新建立最大堆。
依次类推,直到sum数组所有项都计算完,则读到当前序列之前的最小值已经计算完毕。
接着读取下一序列,重复上述步骤。
因为每一步都保证的是当前取到的最小的n个值,所以读完所有的序列之后,也一定是最小的n个值。
二、题解代码
1 #include "stdio.h" 2 #include "stdlib.h" 3 #include <iostream> 4 #include "string.h" 5 #include "math.h" 6 #include <algorithm> 7 8 #define MAX 2010 9 10 using namespace std; 11 12 int sum[MAX], data[MAX], Q[MAX]; 13 14 int main() 15 { 16 int case_num; 17 scanf("%d", &case_num); 18 while(case_num--) 19 { 20 int seq_num, num; 21 int i, j, k; 22 int temp; 23 memset(sum, 0, sizeof(sum)); 24 scanf("%d%d", &seq_num, &num); 25 for(i = 0; i < num; i++) 26 { 27 scanf("%d", &sum[i]); 28 } 29 for(i = 1; i < seq_num; i++) 30 { 31 memset(data, 0, sizeof(data)); 32 sort(sum, sum+num); 33 for(j = 0; j < num; j++) 34 scanf("%d", &data[j]); 35 sort(data, data+num); 36 for(j = 0; j < num; j++) 37 Q[j]=sum[0]+data[j]; 38 make_heap(Q, Q+num); 39 for(j = 0; j < num; j++) 40 for(k = 1; k < num; k++) 41 { 42 temp = sum[k] + data[j]; 43 if(temp > Q[0]) 44 break; 45 pop_heap(Q, Q+num); 46 Q[num-1] = temp; 47 push_heap(Q, Q+num); 48 } 49 50 for(j = 0;j < num; j++) 51 sum[j]=Q[j]; 52 } 53 sort(sum, sum+num); 54 printf("%d", sum[0]); 55 for(i = 1; i < num; i++) 56 printf(" %d", sum[i]); 57 printf("\n"); 58 } 59 return 0; 60 }