poj1042

来源:互联网 发布:软件售后服务收费标准 编辑:程序博客网 时间:2024/05/09 16:46

贪心+枚举

首先总时间减去到达第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;}


 

0 0
原创粉丝点击