zoukankan      html  css  js  c++  java
  • POJ-1042-Gone Fishing(枚举+贪心)

    http://poj.org/problem?id=1042

    题意:

    John有h小时的时间去钓鱼,在一条直线上共有n个湖泊。一开始他位于第一个湖泊,每次钓鱼需要 一个时间单位(每个时间单位5分钟),可得到fi条鱼,且每过一个时间单位,下一个时间单位钓到的鱼减少di。从第i个湖泊到第i+1个湖泊需要ti个时间单位,且只能从标号低的湖泊向标号高的湖泊前进。john最多可以调到多少鱼?

    输入多组数据,每组第一行数据为n(n=0时输入结束),共有n个湖泊,第二行为h,表示John有h个小时时间,第三行n个整数表示fi,第四行n个整数表示di,第五行为n-1个整数,表示ti。

    每组数据输出两行,第一行表示在每个湖泊停留的时间(如果有剩余时间,则全都加在第一个湖泊上),用逗号分隔,第二行表示期望钓到鱼的数量。相邻的两组数据之间输出一个空行。

    思路:

    枚举一下最后一个湖泊,计算每次枚举的的湖泊的最大钓鱼的数量,取最大值即可。

    每次找当前最大数量时,优先队列维护当前节点即可。

    代码:

    #include<iostream>
    #include<stdio.h>
    #include<stdlib.h>
    #include<string>
    #include<iomanip>
    #include<algorithm>
    #include<string.h>
    #include<queue>
    
    using namespace std;
    const int maxn=1100;
    typedef long long ll;
    
    class node
    {
    public:
        int name,num;
        node(int n=0,int u=0)
        {
            name=n;
            num=u;
        }
        bool operator < (const node &x) const{
            if(num==x.num) return name>x.name;
            return num<x.num;
        }
    };
    
    int n,h,f[40],d[50],t[50],ans[50];
    
    int fishing(int p)
    {
        memset(ans,0,sizeof(ans));
        int res=0;
        int time=h*12;
        for(int i=0; i<p; i++) time-=t[i];
    
        priority_queue<node> q;
        for(int i=0; i<=p; i++)
        {
            if(f[i]>0)
             q.push(node(i,f[i]));
        }
    
        node x;
        while(time>0)
        {
            if(q.empty()) break;
            node cur=q.top();
            q.pop();
            time--;
            res+=cur.num;
            cur.num-=d[cur.name];
            if(cur.num>0) q.push(cur);
            ans[cur.name]+=5;
        }
    
        return res;
    }
    
    int main()
    {
        int flag=0;
        while(cin>>n&&n)
        {
            if(flag) cout<<endl;
            flag=1;
            cin>>h;
            for(int i=0; i<n; i++) cin>>f[i];
            for(int i=0; i<n; i++) cin>>d[i];
            for(int i=0; i<n-1; i++) cin>>t[i];
    
            int ma=0,manum=0,s;
            for(int i=0; i<n; i++)
            {
                int s=fishing(i);
                if(s>ma)
                {
                    ma=s;
                    manum=i;
                }
            }
            fishing(manum);
    
            int sum=0;
            for(int i=0; i<n; i++) sum+=ans[i];
            for(int i=0; i<manum; i++) sum+=t[i]*5;
            sum=h*60-sum;
            cout<<ans[0]+sum;
            for(int i=1; i<n; i++) cout<<", "<<ans[i];
            cout<<endl<<"Number of fish expected: "<<ma<<endl;
        }
        system("pause");
        return 0;
    }
  • 相关阅读:
    多维数组的索引与切片
    多维数组
    开学第一课Java考试
    大一第九周学习体会
    大一第八周学习体会
    大一第七周学习体会
    大一第六周学习体会
    大一第五周学习体会
    《大道至简》读后感
    大一暑假第四周学习体会
  • 原文地址:https://www.cnblogs.com/sweetlittlebaby/p/14322746.html
Copyright © 2011-2022 走看看