算法第四章作业

1.对贪心算法的理解

贪心算法作出在当前看来问题的最好选择。贪心算法并不是从整体考虑最优解,而是从局部出发选择的最优解。虽然对所有问题不一定是整体的最优解,但是在很多情况下都是整体最优或者是接近最优解。贪心算法,最重要的是找到这个问题的贪心策略,然后用反证法,替代法证明其正确性。

 

2.删数问题

问题描述

给定n位正整数a,去掉其中任意k≤n 个数字后,剩下的数字按原次序排列组成一个新 的正整数。对于给定的n位正整数a和正整数 k,设计一个算法找出剩下数字组成的新数最 小的删数方案。

输入格式:

第 1 行是1 个正整数 a。第 2 行是正整数k。

输出格式:

输出最小数。

输入样例:

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

178543 4

输出样例:

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

 

贪心策略:从高位开始找到连续递增的子序列,删掉子序列中最大数

#include<iostream>
#include<cstring>
using namespace std;
//贪心思想:从高位开始找到连续递增的子段,删掉最最长字段的最大的数
int main(void)
{
    char n[200];
    int k;
    cin >> n >> k;
    
    int len=strlen(n);
    
    while(k)//不断改变数组的长度
    {
        int i=0;
        
        while(n[i]<=n[i+1])
        {
            i++;
        }
        while(i<len-1)
        {
            n[i]=n[i+1];
            i++;
        }
        len--;
        k--;
    }
        int flag=0;//判断高位是不是0
        shan
        for(int i=0; i<len; i++)
        {
            if(n[i]=='0'&&flag==0&&i<len-1)
                continue;
            else
            {
                cout << n[i];
                flag=1;
            }
        }
        return 0;
    }
    
    
    

3.遇到的问题及结对编程的情况

  贪心算法,在我看来就困难的是找到给出题目的贪心策略,并且要证明其正确性。就拿删除问题来说,本来一开始和搭档讨论是找到这个数组里面的最大值,然后删掉最大的,继续找第二大的数。这个策略在我们想来,确实是最直观最明朗的。但是在代码实现上,出现了很多的问题。首先是字符串的输入,没有想到直接应char[], 而是直接用了求余取个位数存进整型数组。 后来是对最大值的查找,用了多重循环,导致复杂度很高。输出的时候也存在问题。从这道题,我了解到自己在一些比较基础的问题上,还是存在不足。对于整型的应用多余字符串,所以导致一接触字符串就开始慌。

  结对编程和搭档的合作越来越默契,所以希望下一次也能一起走花路。

  最后,是对这一次期中考的总结。这次期中考,自己敲代码敲得非常差。其实自己也有在好好复习,也重新刷了pta的题目,以及去网上看了一些视频。但是对于期中考给出的动态规划的题目,还是敲得有点一言难尽。可能是自己确实没有真正的掌握把。还是会有一种很强的挫败感,希望下一次自己会越来越好。

 

posted @ 2020-11-15 10:46  彭珊珊  阅读(77)  评论(0编辑  收藏  举报