Gone Fishing POJ 1042
#include<cstdio> #include<iostream> #include<algorithm> #include<cstring> using namespace std; /* 枚举以不同湖结束的情况(路上时间固定),从其中每次选钓鱼量最大的(注意在这里不需要考虑顺序,因为迟早为轮到这个点) 在前面不同湖里钓鱼时间 int t[i][j] i为结束时在j点上钓鱼花费时间 ti[],di[],fi[] 枚举的时候要创建临时数组temp保存fi的值,在temp上修改 */ #define MAXN 100 int n,h; int fi[MAXN],ti[MAXN],di[MAXN]; int temp[MAXN];//保存临时鱼的数量 int sum[MAXN]; int time[MAXN][MAXN];//以i点结束时在j点停留的时间 void solve() { memset(time,0,sizeof(time)); memset(sum,0,sizeof(sum)); for(int i=1;i<=n;i++) { memcpy(temp,fi,sizeof(fi)); int T = h*60; for(int j=1;j<i;j++) T-=ti[j]*5; while(T>0) { int k = max_element(temp+1,temp+i+1)-temp; //cout<<";;"<<k<<endl<<";;"<<*max_element(temp+1,temp+i+1)<<endl; time[i][k]+=5; sum[i]+=temp[k]; temp[k]-=di[k]; if(temp[k]<0) temp[k] = 0; T=T-5; } } int l = max_element(sum+1,sum+n+1)-sum; //cout<<";;"<<l<<endl; for(int i=1;i<=n;i++) { if(i!=1) printf(", "); printf("%d",time[l][i]); } printf("\nNumber of fish expected: %d\n\n",sum[l]); } int main() { while(scanf("%d",&n)) { if(n==0) break; scanf("%d",&h); for(int i=1;i<=n;i++) { scanf("%d",&fi[i]); } for(int i=1;i<=n;i++) { scanf("%d",&di[i]); } for(int i=1;i<=n-1;i++) { scanf("%d",&ti[i]); } solve(); } return 0; }