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];
}

 

posted @ 2013-01-15 18:25  金海峰  阅读(1900)  评论(0编辑  收藏  举报