第四章贪心算法实验报告
第四章贪心算法实验报告
问题描述:
(删数问题)给定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)
心得体会(对本次实践收获及疑惑进行总结):
用贪心算法解决题目时,只考虑局部最优解,换言之,要用贪心算法解题,就要保证该问题的整体最优解可化分为一个个局部最优解,这也是最难的一点。
并且还需要经常的尝试各种方法来确定最优解决方案!