zoukankan      html  css  js  c++  java
  • poj1042

    题意:有n个湖,每个湖有一个初始的每单位时间的上钩鱼数,在那里钓鱼时该上钩率会以di的速率不断下降,不钓的时候上钩率不变。这n个湖是排成一排的,从第一个湖开始每个单位时间可以选择钓鱼或者往下一个湖走,这些路是单向的不能往回走。给定总时间h,问最多能钓到多少鱼。

    分析:我们依次枚举究竟要在前多少个湖钓鱼,那么我们可以先将路上的时间计算好,然后人为我们可以在这几个湖之间瞬间转移,每次挑一个上钩率最高的湖去钓即可。

    View Code
    #include <iostream>
    #include <stdio.h>
    using namespace std;
    
    const    int        maxn=26,maxh=16;
    
    void    init();
    void    work();
    void    print();
    void    make(int a,int time);
    
    int        N,n,h,f[maxn],d[maxn],t[maxn-1],ans[maxn],ansf;
    bool    p=false;
    
    int main()
    {
    //    freopen("t.txt","r",stdin);
        N = 1;
        while (N--)
        {
            while (cin>>n&&n!=0)
            {
                init();
                work();
                print();
            }
        }
        return 0;
    }
    
    void init()
    {
        int        i;
        
        cin>>h;
        h=h*12;
        ansf=-1;
        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];
    }
    
    void work()
    {
        int        i,time=0;
    
        t[0]=0;
        for (i=1;i<=n;i++)
        {
            time+=t[i-1];
            make(i,h-time);
        }
    }
    
    void print()
    {
        int        i;
    
        if (p)
            cout<<endl;
        for (i=1;i<n;i++)
            cout<<ans[i]*5<<", ";
        cout<<ans[n]*5<<endl<<"Number of fish expected: "<<ansf<<endl;
        p=true;
    }
    
    void make(int a,int time)
    {
        int        i,ls[maxn],max1,maxi,fish=0,ans1[maxn],j;
    
        memset(ans1,0,sizeof(ans1));
        for (i=1;i<=a;i++)
            ls[i]=f[i];
        while (time>0)
        {
            max1=-1;
            maxi=-1;
            for (i=1;i<=a;i++)
                if (ls[i]>max1)
                {
                    max1=ls[i];
                    maxi=i;
                }
            ans1[maxi]+=1;
            fish+=max1;
            ls[maxi]=0>ls[maxi]-d[maxi]?0:ls[maxi]-d[maxi];
            time--;
        }
        if (fish<ansf)
            return;
        if (fish>ansf)
        {
            for (i=1;i<=n;i++)
                ans[i]=ans1[i];    
            ansf=fish;
            return;
        }
        j=1;
        while (j<=n&&ans1[j]==ans[j])
            j++;
        if (ans1[j]>ans[j])
            for (i=1;i<=n;i++)
                ans[i]=ans1[i];
    }
  • 相关阅读:
    使用Python创建自己的Instagram滤镜
    TensorFlow v2.0实现逻辑斯谛回归
    自动驾驶研究回顾:CVPR 2019摘要
    dp cf 20190613
    简单搜索 kuangbin C D
    树形dp compare E
    区间dp E
    Codeforces Round #564 (Div. 2)
    网络流 + 欧拉回路 = B
    网络流 A
  • 原文地址:https://www.cnblogs.com/rainydays/p/2861686.html
Copyright © 2011-2022 走看看