算法第四章作业(贪心算法)

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函数,对排序的方法不太记得了。需要重新回顾以前学过的排序方法。

结对编程情况:独立编程,有遇到问题都能沟通解决好。能够互相查漏补缺。

 

posted on 2020-11-15 11:18  绮雯  阅读(132)  评论(0编辑  收藏  举报