zoukankan      html  css  js  c++  java
  • 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;
        }

    } 

  • 相关阅读:
    填坑总结:python内存泄漏排查小技巧
    springMVC注解中@RequestMapping中常用参数value params 以及@RequestParam 详解
    springMVC 自定义类型转换器
    为什么Java需要lambda 表达式? 上帝爱吃苹果
    利器| Cypress 强大全新的 Web UI 测试框架应用尝鲜
    缺少锻炼面试的机会?城市群之北上广杭一起来了!
    实战 | 基于JMeter 完成典型电商场景(首页浏览)的性能压测
    一文搞定 pytest 自动化测试框架(一)
    测试面试 | Java 经典面试题汇总
    软件测试工程师成长痛点和职业发展建议
  • 原文地址:https://www.cnblogs.com/liuxin13/p/4383903.html
Copyright © 2011-2022 走看看