算法第四章上机实践报告

1.实践题目

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

输入格式:

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

输出格式:

输出最小数。

 

2.问题描述

去掉k 个数后,剩下的数字按原次序排列组成一个新 的正整数。

 

3.算法描述(说明你的贪心策略,并且参考会场安排问题,利用反证法证明贪心选择和最优子结构性质)

输入数据可能过大,所以用char a[]存储数据。

运用贪心算法,对整数循环扫描,

当前一位比后一位大时,将当前位删除,将后面的数整体向前移动,

若所有数字按照升序排列,则删除最后一位。

!要将字符串前导的0删除掉

!当删数后得到的字符串全为0时,只输出一个0

#include<iostream>
using namespace std;
int main(){
string a;
int i, k;
int length;
cin >> a >> k;
length = a.size();

while(k-- > 0){
i = 0;
length = a.size();
while(a[i] <= a[i + 1] && i < length){
i++;
}
while(i < length)
{
a[i] = a[i+1];                         //记录前导0的个数
i++;
}
}

length = a.size();
i = 0;
while(a[i] == '0')
i++;
if(i > 0 && i == length - 1){     //删数后数组全为 0
cout << "0";
}
else{
while(i < length)
{
cout << a[i];
i++;
}
}

}

4.算法时间及空间复杂度分析(要有分析过程)

时间复杂度:在有n个数字的数组中删除k个数,进行k次扫描,时间复杂度为O(kn)。

空间复杂度:运用了一个字符型数组进行存储,故空间复杂度为O(n)。

 

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

要更多的注意处理输出字符串。

简化代码避免不必要重复

 

posted on 2019-11-13 18:03  懵逼的老山羊  阅读(120)  评论(0编辑  收藏  举报

导航