贪心算法是什么?
贪心算法,又称贪婪算法,顾名思义,就是每一步就只顾眼前的利益,长远的打算是会被忽略的,每一步都只是在当下做出最优解。当然,由于他只顾眼前利益,因此对于不少的需要长远的考虑的题目用不了。
贪心算法适用于哪种题型?
这个嘛……可以用作那些不需要做长远考虑的题,比如说钱币问题啊、排队打水啊等等,本篇文章将用排队打水的实例说明贪心算法。
排队打水问题
有 𝑛 个人排队到 𝑟 个水龙头去打水,他们装满水桶的时间 𝑡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;
}
总结
贪心算法并不难,运用起来也不难,但是问题总是要顾及全局,所以贪心是很常用,但考试考的几率不高(初学者测试除外)(指的是高难度的考试)。当然,相信你也学会了贪心算法了吧。