机试练习07:poj2442——最大堆

一、题解方法

主要是利用stl库中的make_heap,堆排序。

声明三个数组:

  1. sum[MAX]: 存放读取到当前序列前的最小和
  2. data[MAX]: 存放当前序列的n个值
  3. 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 }

 

转载于:https://www.cnblogs.com/alyssayoung/p/8796880.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值