算法第四章作业
作业:
1.贪心算法:就是通过求局部最优解,并将所有局部最优以相似的方式求得并结合,进而得到全局最优解的一种算法。
2.满足性质:通过观察,我们能发现,每次去除的数字具有一定的特征,也就是从左到右,递增序列的最后一个数即为去除数(递增序列里面可以出现相等的数,所以才取最后一个)。因此根据这个局部最优解,可以依次以相同的方法去除需要满足的个数,从而达到全局最优
3.问题:没观察出来这样的性质,一开始都是直接上,结果算法错了都不知道。结对编程跟以往一样,没多大问题。
选题: 4-2 删数问题 (110分)
给定n位正整数a,去掉其中任意k≤n 个数字后,剩下的数字按原次序排列组成一个新 的正整数。对于给定的n位正整数a和正整数 k,设计一个算法找出剩下数字组成的新数最 小的删数方案。
输入格式:
第 1 行是1 个正整数 a。第 2 行是正整数k。
输出格式:
输出最小数。
输入样例:
在这里给出一组输入。例如:
178543
4
输出样例:
在这里给出相应的输出。例如:
13
1 #include <iostream> 2 #include <cstring> 3 using namespace std; 4 5 const int maxn=1000; 6 char a[maxn]; 7 8 int main() 9 { 10 11 int k; 12 scanf("%s%d",a,&k); 13 14 int len=strlen(a); 15 16 int i; 17 while(k--){ 18 i=0; 19 while(a[i]<=a[i+1]){ 20 i++; 21 } 22 /* 23 从后往前移数组,将元素移除, 24 这样才能方便下次删除元素 25 */ 26 while(i<len-1){ 27 a[i]=a[i+1]; 28 i++; 29 } 30 len--;//长度减一 31 } 32 33 //排除最高位的0 34 int j=0; 35 while(a[j]=='0'){ 36 j++; 37 } 38 //输出 39 for(i=j;i<len;i++){ 40 printf("%c",a[i]); 41 } 42 43 return 0; 44 }