算法第四章作业(贪心算法)
1.你对贪心算法的理解
贪心算法是指在问题求解时,总是做出在当前看来最好的选择。也就是说,不从整体最优上加以考虑,他所能做出的仅是某种意义上的局部最优解。就像找零是面值是50 10 5 1和面值是4 3 1,如果用贪心算法,得出的前者结论可以是最优,但是后者就会出现非最有借情况。
2.请选择一道作业题目说明你的算法满足贪心选择性质
7-3 排队接水 (15分)
有n个人在一个水龙头前排队接水,假如每个人接水的时间为Ti,请编程找出这n个人排队的一种顺序,使得n个人的平均等待时间最小。
输入格式:
共两行,第一行为n(1≤n≤1000);第二行分别表示第1个人到第n个人每人的接水时间T1,T2,…,Tn,每个数据之间有1个空格。
输出格式:
输出为这种排列方案下的平均等待时间(输出结果精确到小数点后两位)。
输入样例:
10
56 12 1 99 1000 234 33 55 99 812
输出样例:
291.90
#include<iostream> #include<iomanip> #include<algorithm> using namespace std; int main(){ int n,sum=0,t=0; cin>>n; int a[n]; for(int i=0;i<n;i++){ cin>>a[i]; } sort(a,a+n); for(int i=0;i<n-1;i++){ t=t+a[i]; sum=sum+t; } cout<<fixed<<setprecision(2)<<(double)sum/n; }
这个例题里,想要等待时间最短,需要最多时间的人不能排在最前面,排在前面的人需要的时间越少越好。所以,先将需要的时间从小到大排序,然后逐个算出等待时间
56 12 1 99 1000 234 33 55 99 812
排序后: 1 12 33 55 56 99 99 234 812 1000
等待时间t: 0 1 13 46 101 157 256 355 589 1401
最后将t的每个数加起来÷n就可以得出最佳答案
3.请说明在本章学习过程中遇到的问题及结对编程的情况
太过于依赖 sort函数,对排序的方法不太记得了。需要重新回顾以前学过的排序方法。
结对编程情况:独立编程,有遇到问题都能沟通解决好。能够互相查漏补缺。