第四章贪心算法实验报告

第四章贪心算法实验报告

 问题描述:

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

  输入格式:

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

  输出格式:

  输出最小数。

  输入样例:

  178543 

  4 

  输出样例:

  13

问题求解:

  因为求最小的数,根据贪心算法,即将大的数给删去,且保持原有的顺序。第一种:字符串数组,进行排序,删去大的数。但不太合适,因为会打乱顺序,复原也不是很方便;第二种:将每个数字分开,前者与后者进行比较,将大的数字删除(后面往前面覆盖+缩小长度)

 

算法描述:

#include<bits/stdc++.h>
using namespace std;
char n[100];
int main(){
    int k;
    int len;
    int flag=1;
    cin>>n;
    cin>>k;
    len=strlen(n);
    while(k!=0){
        for(int i=0;i<len;i++){
            if(i==len-1){
                len--;
                break;
            }
            else if(n[i]>n[i+1]){
                for(int j=i;j<len-1;j++){
                    n[j]=n[j+1];
                }
                len--;
                break;
            }
                
            
        }
        k--;
   
    }
    for(int i=0;i<len;i++){
       if(n[i]=='0'&&i<len-1&&flag==1){
            continue;
       }
       else{
           cout<<n[i];
        flag=0;
       }
    }
    
}

分析该算法的时间和空间复杂度:

  时间复杂度:主函数中有两层循环体,循环k次,时间复杂度为O(n^2)

  空间复杂度:借用一个char数组来存储a,a共有n位,空间复杂度为O(n)

心得体会(对本次实践收获及疑惑进行总结):

  用贪心算法解决题目时,只考虑局部最优解,换言之,要用贪心算法解题,就要保证该问题的整体最优解可化分为一个个局部最优解,这也是最难的一点。

  并且还需要经常的尝试各种方法来确定最优解决方案!

 

 

 

posted @ 2021-11-12 15:52  Fan文韬武略~  阅读(178)  评论(0编辑  收藏  举报