zoukankan      html  css  js  c++  java
  • POJ1042 贪心钓鱼

    题意:
          你有H小时(H*12个单位)时间去用,有n个鱼池在一条直线上,一开始你在1的位置,可以选择在某些鱼池上钓鱼,但是如果持续在一个鱼池上钓鱼钓鱼速度回成线性减少,初始每个时间单位钓fi条,然后下一个时间单位钓fi-di条,再下一个fi-di-di条,每个鱼池和他下一个鱼池的距离是ti个时间单位,最后你可以听到任意一个鱼池上,问最多钓多少条鱼,然后输出在个鱼池的停留时间和最多的鱼数。


    思路:
          枚举终点,对于每一个枚举的终点也就是相当于拥有了一段可以随意选的鱼塘,然后我们在枚举区间没一个单位一个单位的去选,每次都去选最优的一个,然后加到总和里,然后把当前这个鱼塘的速度改变下,这里可以用优先队列去实现,每次拿出一个最优的,然后更新总和,然后把拿出来这个更改数值后存回队列,还有就是注意输出要求,答案不确定的时候输出什么啥的一些小细节。


    #include<queue>
    #include<stdio.h>
    #include<string.h>


    using namespace std;


    typedef struct NODE
    {
        int id ,f ,d;
        friend bool operator < (NODE a ,NODE b)
        {
            return a.f < b.f || a.f == b.f && a.id > b.id;
        }
    }NODE;


    int main ()
    {
        int n ,h ,i ,j ,sum ,tsum;
        int ans[30] ,tans[30];
        int tt[30];
        NODE node[30];
        int mk = 0;
        while(~scanf("%d" ,&n) && n)
        {
            if(mk) printf(" ");
            mk = 1;
            scanf("%d" ,&h);
            for(i = 1 ;i <= n ;i ++)
            {
                scanf("%d" ,&node[i].f);
                node[i].id = i;
            }
            for(i = 1 ;i <= n ;i ++)
            scanf("%d" ,&node[i].d);
            for(i = 1 ;i < n ;i ++)
            scanf("%d" ,&tt[i]);
            memset(ans ,0 ,sizeof(ans));
            sum = -1;
            int s = 0;
            h *= 12;
            for(i = 1 ;i <= n ;i ++)
            {
                if(i == 1) s = 0;
                else s += tt[i-1];
                if(s > h) break;
                priority_queue<NODE>q;
                NODE xin ,tou;
                for(j = 1 ;j <= i ;j ++)
                q.push(node[j]);
                int hh = h - s;
                memset(tans ,0 ,sizeof(tans));
                tsum = 0;
                while(hh--)
                {
                    tou = q.top();
                    q.pop();
                    tans[tou.id] += 5;
                    tsum += tou.f;
                    tou.f -= tou.d;
                    if(tou.f < 0) tou.f = 0;
                    q.push(tou);
                }
                if(tsum > sum)
                {
                    for(j = 1 ;j <= n ;j ++)
                    ans[j] = tans[j];
                    sum = tsum;
                }
            }
            for(i = 1 ;i <= n ;i ++)
            {
                if(i == n) printf("%d " ,ans[i]);
                else printf("%d, ",ans[i]);
            }
            printf("Number of fish expected: %d " ,sum);
        }
        return 0;
    }



  • 相关阅读:
    excel多个工作表数据快速合并到一个工作表方法
    客商申请单客商编码自动编码
    如何实现Excel多人共享与协作
    商家推销技巧-将广告做成实用信息
    如何实现扫码填报信息
    DBSync如何连接并同步MySQL
    如何在微信中发布动态信息
    一款数据库比较与同步软件的设计与实现
    【原创】在 ASP.NET Core 3.1 中使用 Senparc.Weixin.Work 企业微信 SDK —— 发送文本消息
    【原创】在 .NET Core 3.1 中使用 Senparc.Weixin.Work 企业微信 SDK —— 发送文本消息
  • 原文地址:https://www.cnblogs.com/csnd/p/12062456.html
Copyright © 2011-2022 走看看