zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    Qtcreator中printf()/fprintf()不显示问题处理方法
    C++实现斐波那契数列
    DAPP超详细解释
    自底向上的合并排序算法
    Python 生成哈希hash--hashlib模块
    使用js的一些小技巧
    js——事件
    django学习
    js——js特效
    js--DOM学习
  • 原文地址:https://www.cnblogs.com/atmacmer/p/5210743.html
Copyright © 2011-2022 走看看