贪心:服务等待

题目内容:

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;
} 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值