poj1042

题目大意:去捕鱼
约翰去参加一个垂钓旅行,他有h小时可以使用在该地区有n (2 <= n <= 25) 个湖泊可以沿着一个单一的路到达,约翰从湖泊1开始,但是它可以在任何湖泊结束他如果想,他仅仅只可以从一个湖到另一个湖,除非他想否则不会停留在任何湖泊,对于每个i=1,......,n-1,每间隔5分钟,都会从湖i到湖i+1来表示为ti( 0 < ti <=192),例如t3=4,意思就是将会花费20分钟时间从湖3到湖4,帮助约翰完成这次钓鱼旅行,约翰收集了一些关于湖泊的信息,对于每个湖i,在最初的5分钟能捕到鱼的数目,表示为fi(fi>=0),已经知道,每过5分钟钓的鱼的数量都会减少di(di>=0),如果鱼的数量在接下来的时间间隔内小于等于di,在接下来的时间内将没有鱼出现,为了简化问题,约翰认为没有别的人捕鱼影响他捕鱼的数量。
写一个程序帮助约翰可以捕到最多的鱼,在每个湖泊里面花费的时间必须是5的倍数。
用优先队列取每个阶段的最大值
#include<stdio.h>
#include<queue>
using namespace std;

#define maxn 30

struct node
{
    int fi, di, index, p;
    friend bool operator < (node n1, node n2)
    {
        if(n1.fi != n2.fi)
            return n1.fi < n2.fi;
        return n1.index > n2.index;
    }
};

void Solve(int ans[], node a[], int n, int *Max, int Time);

int main()
{
    int n, t=0;

    while(scanf("%d", &n), n)
    {
        int i, H, Max=-1, ans[maxn]={0}, ti[maxn]={0}, time=0;
        node a[maxn];

        scanf("%d", &H);

        H = H*12;

        for(i=0; i<n; i++)
            scanf("%d", &a[i].fi);
        for(i=0; i<n; i++)
        {
            scanf("%d", &a[i].di);
            a[i].index = i;
            a[i].p = 0;
        }
        for(i=1; i<n; i++)
            scanf("%d", &ti[i]);

        for(i=0; i<n; i++)
        {
            time += ti[i];
            Solve(ans, a, i+1, &Max, H-time);
        }

        if(t)printf(" ");t++;

        for(i=0; i<n; i++)
            printf("%d%s", ans[i]*5, i==n-1?"  ":"");
        printf("Number of fish expected: %d ", Max);
    }

    return 0;
}
void Solve(int ans[], node a[], int n, int *Max, int Time)
{
    int i, sum=0;
    priority_queue<node> Q;
    node s;

    for(i=0; i<n; i++)
    {
        s = a[i];
        Q.push(s);
    }

    if(Time < 0)return ;

    while(Time)
    {
        Time--;

        s = Q.top(), Q.pop();
        sum += s.fi;
        s.fi -= s.di, s.p++;
        if(s.fi < 0)
            s.fi = 0;
        Q.push(s);
    }

    if(*Max < sum)
    {
        while(Q.size())
        {
            s = Q.top(), Q.pop();
            ans[s.index] = s.p;
        }
        *Max = sum;
    }

} 

原文地址:https://www.cnblogs.com/liuxin13/p/4383903.html