算法第四章作业
1. 我对贪心算法的理解
贪心算法是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的是在某种意义上的局部最优解。
贪心算法不是对所有问题都能得到整体最优解,关键是贪心策略的选择,选择的贪心策略必须具备无后效性,即某个状态以前的过程不会影响以后的状态,只与当前状态有关。
2. 请选择一道作业题目说明你的算法满足贪心选择性质
4-3 最优合并问题
1 #include <bits/stdc++.h> 2 using namespace std; 3 #define MAX 500 4 int n; 5 vector<int> v; 6 bool cmp(int a,int b) 7 { 8 return a>b; 9 } 10 //获得最多比较次数 11 int getMax() 12 { 13 //把输入的先拷贝一份 14 vector<int> v1(v); 15 //sum记录次数 16 int sum=0; 17 //按照从大到小排序 18 sort(v1.begin(),v1.end(),cmp); 19 //合并的时候,当size等于1的时候,就代表合并完了 20 while(v1.size()>1) 21 { 22 //t 临时变量,用来记录 两个序列合并之后的长度 23 int t=0; 24 t+=v1[0]; 25 t+=v1[1]; 26 //让第二个先变成合并之后的长度,两个最大的相加之后赋给第二个值,可以保证还是有序的。 27 v1[1]=t; 28 t--; 29 sum+=t; 30 //把第一个删掉 31 v1.erase(v1.begin()); 32 } 33 return sum; 34 } 35 //获得最小比较次数,稍微麻烦些,需要每合并两个就要进行排序一次,因为合 36 //并完的需要重新放到vector中,但是无论是放到开头还是放到末尾,都不能保 37 //证有序,所以需要重新排序一次。 ps :在保证基本有序的情况下,用插入 38 //排序效率更高些。 39 int getMin() 40 { 41 vector<int> v2(v); 42 int sum=0; 43 sort(v2.begin(),v2.end()); 44 45 while(v2.size()>1) 46 { 47 int t=0; 48 t+=v2[0]; 49 t+=v2[1]; 50 v2.push_back(t); 51 t--; 52 sum+=t; 53 v2.erase(v2.begin()); 54 v2.erase(v2.begin()); 55 sort(v2.begin(),v2.end()); 56 } 57 58 return sum; 59 } 60 int main() 61 { 62 cin>>n; 63 int temp; 64 for(int i=0; i<n; i++) 65 { 66 cin>>temp; 67 v.push_back(temp); 68 } 69 cout<<getMax()<<' '; 70 cout<<getMin(); 71 72 return 0; 73 }
贪心选择性质:当求最多比较次数时,只需在样本数组中选取最大的两个,使其相加,即可满足相加的数也是样本数组中最大的一个。
3. 请说明在本章学习过程中遇到的问题及结对编程的情况
问题:会场安排问题中该按什么标准选择会场顺序太难了!!!!orz orz orz.
结对编程的情况:结对编程让我们能更加快的看懂别人的代码以及学习到一道题更简洁的解法。