您的位置:首页 > 编程语言 > Go语言

POJ 1042 Gone Fishing

2014-09-03 20:42 316 查看
POJ 1042 Gone Fishing

一个人去钓鱼 有n个池塘 有h小时的时间可以用来钓鱼 从一个池塘走到下一个池塘需要ti*5分钟

在同一个池塘钓鱼过程中 每五分钟再之后 能钓到的鱼会减少di条 一开始可以钓到fi条鱼

刚看到这题 感觉变量好多 好乱 完全没什么思路

因为是要按池塘的顺序去钓鱼 所以可以枚举当前池塘之前所能钓到的最多鱼的数量

记录鱼塘中现在能掉到的鱼的数量 取当前能钓到鱼最多的池塘 对它进行一次操作

还要记录在每个池塘所花的时间

<pre name="code" class="cpp">#include <cstdio>
#include <iostream>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <string.h>
#include <string>
#include <queue>

#define eps 1e-8
#define op operator
#define MOD  10009
#define MAXN  100100

#define FOR(i,a,b)  for(int i=a;i<=b;i++)
#define FOV(i,a,b)  for(int i=a;i>=b;i--)
#define REP(i,a,b)  for(int i=a;i<b;i++)
#define REV(i,a,b)  for(int i=a-1;i>=b;i--)
#define MEM(a,x)    memset(a,x,sizeof a)
#define ll __int64

using namespace std;

int t[30];

struct node
{
    int f;//鱼的数量
    int d;//减的速度
    int order;//鱼塘序号
    bool operator <(const node p)const
    {
        if(f==p.f)  return order>p.order;//序号小的优先
        return f<p.f;//鱼多的优先
    }
};
node no[30];
node q;

int main()
{
//freopen("ceshi.txt","r",stdin);
    int n;
    int cnt=0;
    while(scanf("%d",&n)!=EOF)
    {
        if(n==0)  break;
        int h;
        scanf("%d",&h);
        for(int i=0;i<n;i++)
        {
            scanf("%d",&no[i].f);
            no[i].order=i;
        }
        for(int i=0;i<n;i++)
            scanf("%d",&no[i].d);
        for(int i=1;i<n;i++)
            scanf("%d",&t[i]);
        t[0]=0;
        h*=60;
//    cout<<"hh "<<h<<endl;
        int ans=-1;//ans=0就WA!!!
        int laketime[30],lktime[30];
        MEM(laketime,0);
        priority_queue<node> Q;
        for(int i=0;i<n;i++)
        {
            h-=t[i]*5;
            MEM(lktime,0);
            int time=h;
//    cout<<"tt "<<time<<"  iii  "<<i<<endl;
            for(int j=0;j<=i;j++)
            {
                Q.push(no[j]);
            }
            int sum=0;
            while(!Q.empty())
            {
                q=Q.top();  Q.pop();
                if(time>0&&q.f>0)
                {
                    sum+=q.f;
                    time-=5;
                    q.f-=q.d;
                    lktime[q.order]+=5;
                    Q.push(q);
                }
            }
//    cout<<"time "<<time<<" lktime"<<lktime[0]<<endl;
            lktime[0]+=time;
            if(sum>ans)
            {
                ans=sum;
                for(int j=0;j<=i;j++)
                    laketime[j]=lktime[j];
            }

        }
        if(cnt>0)
            puts("");
        cnt++;
        printf("%d",laketime[0]);
        for(int i=1;i<n;i++)
            printf(", %d",laketime[i]);
        puts("");
        printf("Number of fish expected: %d\n",ans);
    }
    return 0;
}



                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: