算法第四章作业
- 你对贪心算法的理解
- 这算法也太简单有趣了。
- 就是贪心策略不好确定,很可能不对。
- 要回举反例,贪心策略要优化。
- 请选择一道作业题目说明你的算法满足贪心选择性
- 选择 “ 4-2 删数问题
- 代码:
1 #include <iostream> 2 using namespace std; 3 #include <cstring> 4 #include <algorithm> 5 bool cmp(int x,int y) 6 { 7 return x>y; 8 } 9 int main() 10 { 11 string s; 12 int k; 13 cin >> s >> k; 14 15 while(k--) 16 { 17 for(int i=0;i<s.size();i++) 18 { 19 if(s[i] > s[i+1]) 20 { 21 s.erase(i,1); 22 break; 23 } 24 } 25 } 26 while(s.size()>1 && s[0] =='0') 27 s.erase(0,1); 28 29 cout<<s<<endl; 30 return 0; 31 }
-
说说我贪心心路历程:
- 删掉其中重新排序后的非递增的k个数,结果只过了第一个测试点。(而这题有10个测试点)
- 我贪心的不对,我想到如果a=10086,k=2.显然我的贪心错了,亏大了。
- 优化贪心策略,想到应该 扫描这个a,k次。若当前的数比后一个数字大,就把当前数给打掉。
- 考虑用什么来存储a。 (百度一下),发现string头文件中有个 s.erase(pos,len)的方法,从s[pos]处开始,擦掉包括pos位置的len个字符。譬如s.erase(0,1)擦掉了第一个字符。
- 君子也贪,贪之有道。
- 选择 “ 4-2 删数问题
- 请说明在本章学习过程中遇到的问题及结对编程的情况
- 没啥问题,搭档挺不错滴
别人笑我真君子,我笑他人假骗子