这个题目是标准的贪心算法。题目的大体意思就是,现在给你一些水塘现在这个小孩在池塘1,现在开始钓鱼,刚开始每个池塘有一定数目的鱼,每次钓鱼5分钟鱼的数目会相应的减少,当池塘当前的鱼-每钓一次减少的数目<=0的时候下次将钓不到鱼,当然池塘与池塘之间是有一定间隔的,这个间隔体现在时间上就是从i到i+1所花费的时间是ti当然这个ti*5才是真正的时间了。现在给你这个小孩能钓鱼的时间求他最多能钓多少鱼,并且要求输出在每个池塘停留的时间。这个题目的做法就是如果我们知道了最后是在哪个池塘停止钓鱼的,然后当然我们是一次走过去不会从i号池塘往回走,其余的时间全部都用来钓鱼。现在的问题就是怎么安排在这几个池塘的钓鱼时间,当然我们先是选择出前5分钟鱼最多的池塘钓,然后这个池塘的鱼减掉每次减少的鱼的数目,然后下一个5分钟继续这种做法。要注意题目的输出有个要求,导致必须要把最后停滞在第一个湖的这种情况单独进行计算。还有这个题目隐含了一个意思,这些时间必须全部都耗尽,即使已经没有鱼可钓。
下面看程序。
#include<iostream>
#include<stdio.h>
using namespace std;
int start[26],change[26],stay[26],compare[26],de[26],dis[26];
int main()
{
int n,h,i,time,sum,used,flag,maxi,j,jilu,sumc;
while(cin>>n)
{
if(n==0)
break;
cin>>h;
h=h*60;
for(i=1;i<=n;i++)
scanf("%d",&start[i]);
start[0]=0;
for(i=1;i<=n;i++)
scanf("%d",&de[i]);
for(i=1;i<n;i++)
{
scanf("%d",&dis[i]);
dis[i]=5*dis[i];
}
dis[0]=0;
for(i=1;i<=n;i++)
stay[i]=0;
sum=0;
time=h;
change[1]=start[1];
for(i=1;i<=n;i++)
stay[i]=0;
while(time>0)
{
sum=sum+change[1];
change[1]=change[1]-de[1];
if(change[1]<0)
change[1]=0;
time=time-5;
stay[1]=stay[1]+5;
}
used=0;
for(i=2;i<=n;i++)
{
sumc=0;
used=used+dis[i-1];
time=h-used;
flag=1;
for(j=1;j<=n;j++)
{
change[j]=start[j];
compare[j]=0;
}
while(time>0)
{
maxi=0;
jilu=1;
for(j=1;j<=i;j++)
{
if(change[j]>maxi)
{
maxi=change[j];
jilu=j;
}
}
sumc=sumc+maxi;
change[jilu]=change[jilu]-de[jilu];
compare[jilu]=compare[jilu]+5;
if(change[jilu]<0)
change[jilu]=0;
time=time-5;
}
if(sumc>sum)
{
sum=sumc;
for(int k=1;k<=n;k++)
stay[k]=compare[k];
}
}
for(i=1;i<n;i++)
cout<<stay[i]<<", ";
cout<<stay[n]<<endl;
cout<<"Number of fish expected: "<<sum<<endl<<endl;
}
return 0;
}