zoukankan      html  css  js  c++  java
  • 【动态前k大 贪心】 Gone Fishing

    传送门

    题意

    给定(n)个鱼塘,一共有(h)小时,每个鱼塘初始捕捞能捕捞(f_{i})个,捕捞一次(5)分钟,捕捞一次能够捕捞的量减少(d_{i})个,
    人只能从(1)号湖走到(n)号湖,(i-i+1)号湖花费时间(5 imes t_{i})分钟,问最多能捕捞多少条鱼,每个湖花费的时间是多少,当捕捞鱼数相同时,
    优先捕捞(id)靠前的湖

    数据范围

    (2leq nleq 25)
    (1leq hleq 16)
    (f_{i},d_{i} > 0)
    (0 < t_{i}leq 192)

    题解

    • 捕捞一次花费5分钟,行走也是以5分钟为单位的,首先将时间转换为5分钟为1单位的时间
    • 枚举当前人的终止湖
    • 去掉行走花费的时间
    • 利用大根堆,因为每次钓鱼花费的时间都是相同的,所以每次都只会吊当前捕获量最大的湖,然后重新入堆

    Code

    #include<cstdio>
    #include<cmath>
    #include<cstring>
    #include<cstdlib>
    #include<iostream>
    #include<algorithm>
    #include<vector>
    #include<queue>
    #include<string>
    #include<set>
    #include<map>
    using namespace std;
    
    
    #define close ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    #define rep(i,a,n) for(int i=a;i<n;i++)
    #define per(i,a,n) for(int i=n-1;i>=a;i--)
    #define fi first
    #define se second 
    #define ll long long
    #define pb push_back
    
    
    typedef pair<long long,long long> pll;
    typedef pair<int,int> pii;
    typedef vector<int> vi;
    typedef vector<long long> vll;
    typedef double db;
    
    
    const ll mod=1e9+7;
    const int N=30;
    
    
    ll powmod(ll a,ll b,ll p){ll res=1;a%=p;while(b){if(b&1) res=res*a%p;a=a*a%p;b>>=1;}return res;}
    ll gcd(ll a,ll b) {return b?gcd(b,a%b):a;}
    
    
    struct node
    {
        int f,d,t,id;
        bool operator <(const node&a)const
        {
            if(f == a.f) return id > a.id;
            return f < a.f;
        }
    }u[N];
    int n,h;
    int lt[N],tt[N];
    int _;
    void solve()
    {
        memset(tt,0,sizeof tt);
        scanf("%d",&h);
        rep(i,1,n+1) scanf("%d",&u[i].f);
        rep(i,1,n+1) scanf("%d",&u[i].d);
        rep(i,1,n) scanf("%d",&u[i].t);
        rep(i,1,n+1) u[i].id=i;
        int ans=0;
        rep(i,1,n+1) // 枚举进行捕鱼的湖的终点
        {
            memset(lt,0,sizeof lt);
            int res=0;
            int time=h*12;
            priority_queue<node>q;    
            
    
            rep(j,1,i)
                time -= u[j].t;
            rep(j,1,i+1) q.push(u[j]);
    
            while(time >= 1 && q.size())
            {
                node it = q.top(); 
                q.pop();
                time --;
                lt[it.id]++;
                res+=it.f;
                it.f -= it.d;
                if(it.f<0) it.f=0;
                q.push(it);
            }
    
            if(res>ans)
            {
                ans=res;
                rep(j,1,n+1) tt[j]=lt[j];
            }
            else if(res==ans)
            {
                int flag=0;
                rep(j,1,n+1)
                {
                    if(lt[j]>tt[j]){flag=1; break;}
                    else if(lt[j]<tt[j]) break;
                }
                if(flag)
                {
                    rep(j,1,n+1) tt[j]=lt[j];
                }
            }
        }
        if(_++) printf("
    ");
        rep(i,1,n+1)  
        {
            if(i==n) printf("%d
    ",tt[i]*5);
            else printf("%d, ",tt[i]*5);
            
        }
        printf("Number of fish expected: %d
    ",ans);
    }
    int main(){
        while(scanf("%d",&n)&&n)
            solve();
    }
    
  • 相关阅读:
    [Python] 项目的配置覆盖与合并
    [PHP] dompdf 使用记录
    Ubuntu16.04 desktop 设置共享文件夹 -- 图形界面配置
    (转)你不得不看的六篇知识图谱落地好文
    转 python2 与 python3 的编码
    (转) C#使用ODP.NET(Oracle.ManagedDataAccess.dll)操作Oracle数据库
    django & celery
    (转) 解决django项目部署到nginx+uwsgi服务器后 admin页面样式消失的问题
    Ubuntu 16.04 安装 SVN-Client (RaabitVCS)
    python 2.7
  • 原文地址:https://www.cnblogs.com/hhyx/p/13683684.html
Copyright © 2011-2022 走看看