第四章作业

  1. 1你对贪心算法的理解

                 贪心算法, 感觉比分治,动态规划什么的更加"阳间", 理解或是应用都更加快, 后两个都是不知道什么情况下能做出最好答案而使用的地毯式轰炸答题,                       贪心则是一开始就知道怎么样解决而使用的方法,比如收银台找零问题, 简直不要太直白的解题过程

 

  1. 2请选择一道作业题目说明你的算法满足贪心选择性质

                 

4-3 最优合并问题 (100分)
 

题目来源:王晓东《算法设计与分析》

给定k 个排好序的序列, 用 2 路合并算法将这k 个序列合并成一个序列。 假设所采用的 2 路合并算法合并 2 个长度分别为m和n的序列需要m+n-1 次比较。试设 计一个算法确定合并这个序列的最优合并顺序,使所需的总比较次数最少。 为了进行比较,还需要确定合并这个序列的最差合并顺序,使所需的总比较次数最多。

输入格式:

第一行有 1 个正整数k,表示有 k个待合并序列。 第二行有 k个正整数,表示 k个待合并序列的长度。

输出格式:

输出最多比较次数和最少比较次数。

输入样例:

在这里给出一组输入。例如:

4
5 12 11 2 
 

输出样例:

在这里给出相应的输出。例如:

78 52
 
1
 
#include<bits/stdc++.h>
2
using namespace std;
3
//注意:最小的加第二小的结果,可能比第三小的大, 最大的加上第二大的数的结果,绝对比第三大的数还要大
4
 
int main(){
5
    int k, min=0, max=0;
6
    int a[1000],  b[1000];
7
    cin>>k;
8
 
    for(int i=0; i<k; i++){
9
        cin>>a[i];
10
        b[i]=a[i];
11
    }
12
    sort(a, a+k);//A:从小到大排序
13
    sort(b, b+k);
14
    reverse(b, b+k);//B: 从大到小排序
15
 
    for(int i=0; i<k-1; i++){
16
        a[i+1]+=a[i];
17
        b[i+1]+=b[i];
18
        min+=a[i+1]-1;
19
        max+=b[i+1]-1;
20
        sort(a+i, a+k);
21
    }
22
    cout<<max<<" "<<min;
23
}

                 这里借鉴了其他同学的答题技巧,我自己的原来的代码太罗嗦了,虽然也能完成, 但是总感觉不够舒坦, 注意一点即可:

        最小的加第二小的结果,可能比第三小的大, 最大的加上第二大的数的结果,绝对比第三大的数还要大, 贪心实质:从大加到小,
输出, 从小加到大, 输出,好了,就是这么快乐.
  1. 3请说明在本章学习过程中遇到的问题及结对编程的情况

           问题只有一个,容易漏掉反例, 然后造成一些测试点不能通过,

           结对编程情况非常好,有了同伴一起打题, 才能感受到一起"直面死亡"的快乐, 对, 别误会, 说的就是动态规划还有那些上学期好像学了,

           但是我一点都没记住的数据结构 .两个人学习还是有动力的.

posted @ 2020-11-14 23:23  我啷个晓得  阅读(70)  评论(0编辑  收藏  举报