贪心算法详解

贪心算法是什么?

贪心算法,又称贪婪算法,顾名思义,就是每一步就只顾眼前的利益,长远的打算是会被忽略的,每一步都只是在当下做出最优解。当然,由于他只顾眼前利益,因此对于不少的需要长远的考虑的题目用不了。

贪心算法适用于哪种题型?

这个嘛……可以用作那些不需要做长远考虑的题,比如说钱币问题啊、排队打水啊等等,本篇文章将用排队打水的实例说明贪心算法。

排队打水问题

有 𝑛 个人排队到 𝑟 个水龙头去打水,他们装满水桶的时间 𝑡1,𝑡2,......,𝑡𝑛,𝑡𝑖 为整数且各不相等,请问应如何安排他们的打水顺序才能使他们总共花费的时间最少?

输入格式

第一行 𝑛,𝑟(𝑛≤500,𝑟≤75)

第二行为 𝑛 个人打水所用的时间 𝑇𝑖(𝑇𝑖≤100);

输出格式

最少的花费时间

输入数据 1

3 2
3 1 2

 

输出数据 1

7

 

样例解释

第一个人花了 3 时间,第二个人花了 1 时间,第三个人等第二个人打完水花了 1 时间,自己打水花了 2 时间,所以第三人打水花了 3 时间,总时间花费为 3+1+3=7。

解题思路

呀呀呀,这这这不是一道明显就是贪心的题吗?因为只有前面打水的人所花的时间尽量小,才可以保证后面的人花的总时间小。给数组从小到大排个序,在计算总时间就是最优解。

解题代码

#include<bits/stdc++.h>
using namespace std;
long long n,r,a[23123],sum[31111];
int main(){
	cin>>n>>r;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	sort(a+1,a+1+n);//排序嘛
	int i=1,j=1,ans=0;//j是用来遍历水龙头的
	while(i<=n){
		if(j>r){
			j=1;//水龙头分配完了就下一分配
		}
		sum[j]+=a[i];//累加水龙头的使用时长
		ans+=sum[j];//加上这次等待时间
		i++;//下一个人
		j++;//下一个水龙头
	}	
	cout<<ans;
}

总结

贪心算法并不难,运用起来也不难,但是问题总是要顾及全局,所以贪心是很常用,但考试考的几率不高(初学者测试除外)(指的是高难度的考试)。当然,相信你也学会了贪心算法了吧。

  • 15
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值