题目内容:
n个客户同时向服务器申请服务,每个客户需要的服务时间是t[i],
服务器一次只能服务一个客户,并且服务完成才能服务下一个客户。
在未进行服务前,客户必须等待。需要给出一个服务顺序,使得n个客户的总等待时间最短。
输入描述:
测试数据第一行是正整数n(n<=1000),表示有n个顾客。
接下来的1行中,有n个正整数,表示n个顾客需要的服务时间ti(ti<=1000)
####输出描述:
输出最小平均等待时间,每个答案一行,保留2位小数。
####输入样例:
10
56 12 1 99 1000 234 33 55 99 812
####输出样例:
532.00
#####分析
贪心算法适合一类最优化问题:有一个待选元素集合B,需要经过多步决策选择一些元素进入集合A,知道满足结束条件,最后定义在集合A上的函数f达到最优解
贪心算法:每一步都是当前情况的最优解!(局部最优从而得到整体最优)
首先,可以把本题要求服务n个客户的总等待时间写出来:
第一个人:等待时间(T1)即为他的服务时间t1;
第二个人:等待时间(T2) 即为第一个人服务时间和自己的服务时间: t1 + t2;
第三个人:T3 = t1 + t2 + t3;
…
第n个人:Tn = t1 + t2 + …+ tn;
T总 = t1 + (t1+t2) + (t1+t2+t3) + (t1+t2+t3+t4)+ … + (t1+t2+…+tn);
T总 = n*t1 + (n-1)t2 + (n-2)*t3 + … + tn;
要求总的等待服务时间越短,
就是要上式中系数大的越小(即t1 < t2 < t3 … tn)
ps:找到一个对本题思路、本题贪心算法分析的很仔细的网址:(网页中第一个最佳答案)
https://wenwen.sogou.com/z/q801484643.htm
#####AC的渣渣代码如下
#include<iostream>
#include<algorithm>
#include<iomanip>
using namespace std;
bool cmp(int a, int b){
return a < b;
}
int main(){
int i, n, t[100];
double tsum = 0.0;
cin >> n;
for(i = 0; i< n; i ++)
cin >> t[i];
//对每个客户服务时间排序
sort(t, t+n, cmp);
//求和T
for(i = 0; i < n; i ++){
tsum += 1.0 * (n-i) * t[i];
}
//输出最小平均等待时间;c++控制浮点型小数位
cout << fixed << setprecision(2) << (tsum / n);
return 0;
}