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("
Number of fish expected: %d

",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;
}
原文地址:https://www.cnblogs.com/joeylee97/p/6211529.html