贪心+枚举
首先总时间减去到达第i个湖时所需要的时间(t1+t2+...+ti),然后认为,钓鱼的人可以在这i个湖之间,瞬间移动。
每次都去鱼最多的湖钓(鱼数相同时,去湖的编号小的湖钓),保证了可以钓到最多的鱼。(注意细节,当鱼数<di时,下次就没有了,fi要置为0)
枚举1<=i<=n,取结果最大的方案(用一个数组保存方案)。
#include<iostream>
using namespace std;
int n,h,f[30],d[30],t[30];
int Time[30],tL[30];
int F[30];
int Max(int end)
{
int MAX=F[1],k=1;
for(int i=1;i<=end;i++)
if(F[i]>MAX) {MAX=F[i];k=i;}
return k;
}
int work(int end,int total)
{
int now=0;
memset(Time,0,sizeof(Time));
memset(F,0,sizeof(F));
for(int i=1;i<=end;i++)
F[i]=f[i];
while(total)
{
int k;
k=Max(end);
now+=F[k];
F[k]-=d[k];
if(F[k]<0) F[k]=0;
Time[k]+=5;
total-=5;
}
return now;
}
int main()
{
int i,j;
int total;
int time[30];
while(cin>>n&&n)
{
int ans=-1;
cin>>h;
total=h*60;
for(i=1;i<=n;i++)
cin>>f[i];
for(i=1;i<=n;i++)
cin>>d[i];
for(i=1;i<n;i++)
{
cin>>t[i];
tL[i]=tL[i-1]+5*t[i-1];
}
tL[n]=tL[n-1]+5*t[n-1];
for(i=1;i<=n;i++)
{
if(total>=tL[i])
{
int now=work(i,total-tL[i]);
if(now>ans)
{
ans=now;
for(j=1;j<=n;j++)
time[j]=Time[j];
}
}
else break;
}
for(i=1;i<=n-1;i++)
cout<<time[i]<<", ";
cout<<time[n]<<endl;
cout<<"Number of fish expected: "<<ans<<endl;
cout<<endl;
}
return 0;
}