POJ 1042 Gone Fishing#贪心

(~ ̄▽ ̄)~*

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;

const int N=30;
int n,h,H;//H:记录原本有多少小时的时间;h:贪心的时候,防止H被修改
int res[N],RES[N];//res[]:贪心的时候保存结果;RES[]:用于记录最终结果
int maxn,sum;//maxn:保存最终结果,即捕到的鱼最大值;sum:每轮贪心的时候,用来保存鱼最大值

struct ff
{
    int f,d,t;//f:第i个湖里原本有的鱼数,d:第i个湖被捕过之后的鱼数,t:从第i-1到第i个湖需要的时间
};
ff f[N],F[N];

int main()
{
    while(scanf("%d",&n)&&n)
    {
        memset(RES,0,sizeof(RES));
        maxn=0;
        scanf("%d",&H);
        H*=12; //以5min为单位,输出结果的时候,记得乘以5
        RES[0]=H;//赋初值H,因为有可能1……n-1湖都没有鱼,时间就都花在第一个湖了
        for(int i=0;i<n;i++)
            scanf("%d",&F[i].f);
        for(int i=0;i<n;i++)
            scanf("%d",&F[i].d);
        for(int i=1;i<n;i++)
            scanf("%d",&F[i].t);

        for(int k=0;k<n;k++)
        {//在第0到第k个湖之间捕鱼
            h=H;
            sum=0;
            memset(res,0,sizeof(res));
            for(int i=0;i<n;i++)
                f[i].f=F[i].f;//避免F[]被修改
            for(int i=1;i<=k;i++)
                h-=F[i].t; //把到第k个湖之前所用的时间全部减去,剩下的时间来捕鱼
            if(h<=0) break;

            while(h--)
            {//只要有时间,每次都去鱼最多的湖抓鱼(贪心)
                int index=0;
                for(int i=1;i<=k;i++)
                    if(f[i].f>f[index].f)
                        index=i;
                sum+=f[index].f;
                f[index].f-=F[index].d;//第index个湖被捕之后,就会少掉d条鱼,要更新f[].f值
                if(f[index].f<0)
                    f[index].f=0;//还要注意避免负值
                res[index]++;//只要在第index个湖捕鱼,那么在第index个湖就花去了时间1(单位为/5min)
            }
            if(sum>maxn)
            {//更新最大值maxn,找到最优的状态,把数据记录在RES[]中,因为res[]会清零并用于下一轮的记录
                maxn=sum;
                for(int i=0;i<=k;i++)
                    RES[i]=res[i];
            }
        }
        for(int i=0;i<n-1;i++)
            printf("%d, ",RES[i]*5);//记得*5
        printf("%d
",RES[n-1]*5);//记得*5
        printf("Number of fish expected: %d

",maxn);
    }
    return 0;
}
原文地址:https://www.cnblogs.com/atmacmer/p/5210743.html