• poj1042


    题目大意:

    有n个湖,一个人在这些湖中钓鱼,5分钟钓一次,求给定的时间内能够钓的鱼的最大数量,他的起点是第一个湖泊,可以在任意湖泊终止

    但是只能够往下走,不能返回,每次钓到的鱼会在上一次的基础上减少,当所有的湖泊里的鱼能够钓的数量为0时,但是时间还有剩,都算到第

    一个湖泊上

    输出在每一个湖泊呆的时间,及最大钓鱼数量

    思路:

    枚举+贪心

    一一枚举所经过的湖泊,算出该情况的最优解,具体看代码

    代码如下:

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<iostream>
    using namespace std;
    const int N = 30;//湖的最大数目
    const int M = 200;//钓鱼的最大次数,题目所给16小时,5分钟一单位,16*12
    //time[i]代表在第i个湖钓鱼的次数,fish[i][j]在第i个湖第j次钓鱼的数量
    int time[N],fish[N][M];
    int movetime[N];//movetime[1]=0,movetime[i]代表从第i-1个湖移动到第i个湖所需时间
    int d[N];//每隔一次钓鱼当再一次钓鱼时减少的数量
    int n,h;
    int main()
    {
        //freopen("in.txt","r",stdin);
        while(scanf("%d",&n)!=EOF&&n)
        {
            int ans = 0;
            memset(time,0,sizeof(time));
            memset(movetime,0,sizeof(movetime));
            memset(fish,0,sizeof(fish));
            scanf("%d",&h);
            for(int i=1;i<=n;i++)
                scanf("%d",&fish[i][1]);
            for(int i=1;i<=n;i++)
                scanf("%d",&d[i]);
            for(int i=2;i<=n;i++)
                scanf("%d",&movetime[i]);
            int totalTime = h*12;
            time[1]=totalTime;//全0的情况,也就是不会钓到鱼,把所有的时间都花在第一个湖
    
            //初始化每个湖每次钓鱼的数量
            for(int i=1;i<=n;i++)
                for(int j=2;j<=totalTime;j++)
                    fish[i][j]=max(fish[i][j-1]-d[i],0);//不可能是负数
    
            //枚举所有情况,即只在一个湖,两个湖.....n个湖能够钓到最多的鱼
            for(int k=1;k<=n;k++)
            {
                int maxFish = 0;
                //计算能够钓鱼的时间,就是减掉移动的时间
                int realTime=totalTime;
                for(int i=2;i<=k;i++)
                    realTime-=movetime[i];
                if(realTime<=0)
                    break;//总时间不够耗在路程上时,跳出
                //用来临时记录每个湖的钓鱼次数
                int temp[N];memset(temp,0,sizeof(temp));
                for(int tt=1;tt<=realTime;tt++)
                {
                    //找出每次钓鱼能够最多数量的湖
                    //如果所有的湖的鱼都是0的话,那么就把时间加在第一个湖,p=1;
                    int maxs = 0 , p=1;
                    for(int i=1;i<=k;i++)
                        if(fish[i][temp[i]+1]>maxs)
                        {
                            maxs = fish[i][temp[i]+1];
                            p=i;
                        }
                    maxFish+=maxs;
                    temp[p]++;
                }
                //更新最大值情况
                if(maxFish>ans)
                {
                    ans=maxFish;
                    memcpy(time,temp,sizeof(temp));
                }
            }
            printf("%d",time[1]*5);
            for(int i=2;i<=n;i++)
                printf(", %d",time[i]*5);
            printf("
    Number of fish expected: %d
    
    ",ans);
        }
    }
  • 相关阅读:
    GITHUB随笔 15-5月 junit
    github心得
    (转)哪个瞬间让你突然觉得逛知乎真有用?
    0-1背包问题(the knapsack problem)
    对VSCode在安装了Dev-cpp的电脑上的配置
    非全日制考研资料(未完待续)
    CSS那些事读书笔记-2
    CSS那些事读书笔记-1
    前端面试准备-1
    工作日记-一个有趣的定时任务实现
  • 原文地址:https://www.cnblogs.com/wt20/p/5782473.html
Copyright © 2020-2023  润新知