一、对贪心算法的理解

  贪心算法有两个基本要素:最优子结构的性质、贪心选择性质。其中贪心选择性质意为全局最优解可以通过局部最优解选择得到。一个贪心算法是否具有贪心选择性质即需证明至少有一个最优解中包含所选择的贪心策略。

    在学习贪心算法的过程中,它与动态规划相比要相对简单,动态规划要遵循解题四步,而贪心算法则是列出所能想出的策略,再举出反例将不合适的策略排除,再用贪心选择性质证明剩余的策略即可选出正确的贪心策略。

 

二、例题

排队接水问题——

问题描述:有n个人在一个水龙头前排队接水,假如每个人接水的时间为Ti,请编程找出这n个人排队的一种顺序,使得n个人的平均等待时间最小。

贪心策略:打水用时少的排在前

核心代码如下:

需注意的是int型的相除,int与double的转换;输出两位小数

double TotalTime = 0;
    for(int i = 1; i < n; i++){//T[i]代表的是第i位同学所需打水时间 
        TotalTime += 1.0*(n-i)*T[i]; 
    } 
    cout << fixed << setprecision(2) << TotalTime/n; 

满足贪心选择性质:因为要计算平均等待时间,后者的等待时间里会包含前者接水的时间,所以应该先让接水时间少的人先接水,这样后接水的人等的时间会短一些。

 

三、结对编程情况

    上机第一道题很快解决,但是第二道题【删数问题】我和宜炫同学想了很久——应该用什么样的方式将数组中的数删除

我们想到了以下两种方法(虽然没解决,但是感觉靠近了):

①用a[]数组存放每一位数字,用b[]数组作为标记数组,若b[i]中值为1,则a[i]不输出

②用a[]数组存放每一位数字,但是可改变;用b[]数组表示原数组,不可改变。若要删除a[i],则a[i]+10【意为和b[i]做比较,a[i] != b[i],则不输出b[i]】

下课后思考+上网搜索,应该使用string来存放数字,用erase即可擦去此数。