算法第四章作业
1. 你对贪心算法的理解?
贪心算法将问题分解为多个子问题,然后分别对每一个子问题求最优解,最后将所有子问题的解相加得到原问题的解,在某些时候贪心算法可得原问题的一个最优解,某些时候可得较好的解。
2. 请选择一道作业题目说明你的算法满足贪心选择性质
删数问题
给定n位正整数a,去掉其中任意k≤n 个数字后,剩下的数字按原次序排列组成一个新 的正整数。对于给定的n位正整数a和正整数 k,设计一个算法找出剩下数字组成的新数最 小的删数方案。
输入格式:
第 1 行是1 个正整数 a。第 2 行是正整数k。
输出格式:
输出最小数。
输入样例:
在这里给出一组输入。例如:
178543
4
输出样例:
在这里给出相应的输出。例如:
13
1 #include<bits/stdc++.h> 2 using namespace std; 3 #define ll long long 4 5 string s; 6 int a[10005]; 7 int k; 8 9 int main() { 10 cin >>s; 11 cin >>k; 12 int len = s.size(); 13 int i, j; 14 15 for (int i=0; i<len; i++) 16 a[i] = s[i]-48; 17 18 for (int n=0; n<k; n++) { 19 for (i=0; i<len-1; i++) { 20 if (a[i] > a[i+1]) { 21 for(j=i; j<len-1; j++) 22 a[j] = a[j+1]; 23 break; 24 } 25 } 26 len--; 27 } 28 29 i = 0; 30 while (i<=len-1 && a[i]==0) i++; // 快进到开头不是0 31 32 if (i == len) 33 cout <<0 <<endl; 34 else 35 for(j=i; j<=len-1; j++) 36 cout <<a[j]; 37 38 return 0; 39 }
算法:
若前一位大于后一位,则将此前一位删去,将后一位及后面所有数向前挪一位。
同时,要谨慎的排除开头为零的情况。
3. 请说明在本章学习过程中遇到的问题及结对编程的情况
遇到的问题:选择的贪心算法不正确/想不到适合的贪心策略
结对编程情况:独立编程,互相查缺补漏,提出测试点,对同一方法给出细节上不同的实现方法,拓宽了思路