第四章作业

一、对贪心算法的理解:

贪心算法是一种对某些求最优解问题的更简单、更迅速的设计技术。贪心算法是指在对问题求解时,总是做出在当前看来是最好的选择,而不是全局最优解。一个问题的整体最优解可通过一系列局部的最优解的选择达到,并且每次的选择可以依赖以前作出的选择,但不依赖于后面要作出的选择。这就是贪心选择性质。对于一个具体问题,要确定它是否具有贪心选择性质,必须证明每一步所作的贪心选择最终导致问题的整体最优解。贪心算法设计最关键的一点是贪心策略的选择。

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

题目描述:4-3 最优合并问题

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

解题思路:

  将输入的数按从小到大和从大到小分别排序,然后用a[i+1]和a[i]进行合并,获得合并后序列长度并存放在a[i+1]上,即a[i+1] = a[i]+a[i+1],然后把合并比较次数存放在sum,然后指针后跳一位,从a[i+1]处继续重新排序再合并存放,比较次数累加到sum,直到结束,从而求出最少比较次数。

最大比较次数同里。

  贪心策略:从相邻且最小的数组依次合并,比较次数最少。相反则次数最大。

#include <iostream>
#include <algorithm>
using namespace std;

bool compare(int a,int b)
{
    return a>b; 
}

int main()
{
    int k;
    cin>>k;
    int a[1001],b[1001];
    int sum = 0,sum1 = 0; 
    
    for(int i = 0;i < k;i++){
        cin>>a[i];
        b[i] = a[i];
    } 
        
        
    sort(a,a+k);
    sort(b,b+k,compare);
    
    for(int i = 0;i<k-1;i++){//最好 
        a[i+1] = a[i]+a[i+1];
        sum += a[i+1]-1;
        sort(a+i+1,a+k);
//        cout<<sum<<" ";
    }
        
    for(int i = 0;i<k-1;i++){//最坏 
        b[i+1] = b[i]+b[i+1];
        sum1 += b[i+1]-1;
        sort(b+i+1,b+k,compare);
    }

    cout<<sum1<<" "<<sum<<endl;
    return 0;
}

三、请说明在本章学习过程中遇到的问题及结对编程的情况

本次结对编程情况良好,经过磨合,现在暂无什么差错。

 

posted @ 2020-11-14 21:23  唯安~  阅读(103)  评论(0编辑  收藏  举报