贪心算法的典型案例:打水问题
有n个人排队到r个水龙头前去打水,他们装满水桶的时间分别为t1,t2,t3...tn,打水时间均为整数且各不相等,应该如何安排他们打水顺序才能使他们花费的总时间最少?
每个人的打水时间=排队时间+装满水桶的时间
(假设排队切换等)
要求程序:
输入:有两行,第一行为两个整数,分别是n和r,即人数和水龙头数。
(1<=n<=500)(a<=r<=100)
第二行为n个正整数t1,t2,t3...tn(1<=ti<=100),表示每个人装满水桶的时间
输出:一行,一个正整数,表示他们花费的最少总时间
解决问题代码如下:
include<bits/stdc++.h>
include
using namespace std;
int main()
{
int a[510]={0};
int r,n;
cin>>n>>r;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
sort(a+1,a+n+1); //将每个人按照打水时间进行排序
int sum=0;
for(int i=1;i<=n;i++)
{
if(i>r)
{
a[i]=a[i]+a[i-r]; //核心思路就体现在这里,只要将每次打水时的最佳选择实现,最后就是全部的最佳实现
}
sum+=a[i];
}
cout<<sum<<endl;
system("pause");
return 0;
}
这道题并不算难,贪心算法的核心在于找到每一小部的最优解,从而达到全局的最优解。
下面是一组测试样例。
测试样例
浙公网安备 33010602011771号