算法第四章上机实践报告

1.实践题目

 

 

 2.问题描述

要求n位正整数a删去k个数后得到最小数,删数方案是以删去最大数为基础的,然后考虑其他要补充的条件,包括最后的结果最高位不能是0、删数过程中数字的位置并没有发生改变等,所以仅仅是找到所有数中最小的两个是没有用的,要把每一步删数后可能产生的条件都考虑到。

3.算法描述

本题的贪心策略是将每个位的数进行对比,找到符合a[i]>a[i+1]条件的a[i],这个数就是我们找的更加大的数,删去它,然后继续找下一个符合条件的数,这样最后得到的数就会是我们找的最小数。注意在删数后,要删去的位数k每次都要减一,直到k=0。

以题目所给的178543为例,

1 7 8 5 4 3

先找符合a[i]>a[i+1]的数,发现1<7、7<8,所以前两位都不符合,直到8>5,这时我们删去8,正整数a就变成了17543,

1 7 5 4 3

再找满足条件的数,发现7>5,所以删去7,正整数变成1543,

……

以此类推,最终正整数会变成13即我们想要的数。

以下是代码:

 

#include<cstring>
#include<cstdio>
#include<iostream>
using namespace std;
char a[1000];
int main(){
    //string a;
    cin>>a;
    int k;
    cin>>k;
    int n=strlen(a);
    int l=k;
    while(k){
        for(int i=0;i<n-1;i++){
            if(a[i]>a[i+1]){
                for(int j=i;j<n-1;j++){
                    a[j]=a[j+1]; 
                }
                // n--;
                break;
                }
        }
        k--;
    }
int flag=1;
for(int i=0;i<n-l;i++){
    if(a[i]=='0'&&i!=n-l-1&&flag==1){
        continue;
        }
        else{
            cout<<a[i];
            flag=0;
            }
        }
    }

 

4.算法时间及空间复杂度分析

时间复杂度:有一个双重循环,所以时间复杂度为O(n^2);

空间复杂度:开销是一个string字符串,所以空间复杂度为O(n)。

5.心得体会

这次实验题大部分都是我的同伴打的代码,我主要负责在她遇到困难时提供一些帮助,就比如在第二题中,最高位不能是1,这个算是这道题目中一个需要考虑的点,一开始没有考虑完全,但最后还是做出来了。并且我发现,有时看别人的代码带入别人的思路可以给自己答题时带来更多的灵感。

 

 

 

posted @ 2019-11-18 02:06  Backey  阅读(133)  评论(0编辑  收藏  举报