• Poj 1042 gone fishing


    题目大意

    题目就是在给定钓鱼时间,湖泊之间转移的时间,各湖泊初始鱼量,各湖泊鱼量的下降指数求在规定时间内的最大钓鱼量。

    解题思路

    本题目采用枚举+贪心的方法可以求解出来。首先我们需要对题目进行一些改造,我们需要枚举从第一个湖泊到第n个湖泊之间各种可能情况,然后再这些情况中选出最大值,输出结果。由于到各个湖泊的时间有所差异,我们首先需要把耽搁在转移路径上的时间除去,然后在剩余时间内确定钓鱼量的最大值,对于每次选择,我们采用贪心的方式选取最大值,进而得出最优解。

    本题目需要特别注意输出格式,容易出现小错误:

    我们需要考虑flag=0的情况,下面我们看一组数据:

    *        看数据:
    * 2
    * 1
    * 0 0
    * 1 1
    * 1
    * 答案:
    * 60 0
    * 0
    这里如果不写出代码:
              if(flag == 0)
    { 60 printf("%d", hour*5); 61 for(int i=1; i<n; i++) 62 printf(", %d", 0); 63 printf(" Number of fish expected: %d ", flag); 64 }
    那么最后会一直wrong answer。

    AC代码

     1 #include<stdio.h>
     2 struct lake
     3 {
     4     int fish;
     5     int decrease;
     6     int time;
     7     int stay;
     8 } K[30];
     9 int main()
    10 {
    11     int k_fish[30],k_stay[30],T[30];//T[i]表示路上花去时间
    12     int sum,maxn,flag,i,j,p,t,n,hour,k;
    13     while(scanf("%d",&n)&&n!=0)
    14     {
    15         //第一步的输入数据
    16         int hour;
    17         scanf("%d",&hour);
    18         hour*=12;
    19         for(int i=0;i<n;i++)
    20         {
    21             scanf("%d",&K[i].fish);
    22             k_fish[i]=K[i].fish;//复制数组方便枚举各种情况时还原K[i].fish
    23         }
    24         for(int i=0;i<n;i++)
    25         scanf("%d",&K[i].decrease);
    26         K[0].time=0;
    27         for(int i=1;i<=n-1;i++)
    28         scanf("%d",&K[i].time);
    29        T[0]=K[0].time;
    30        flag=0;//初始化最大值
    31         for(int i=0;i<n;i++)
    32         {
    33             if(i)
    34             T[i]=T[i-1]+K[i].time;//在转移过程中所消耗的时间
    35             for(int s=0;s<n;s++)
    36             {K[s].fish=k_fish[s];K[s].stay=0;}//每一次枚举都初始化数据,并把在每一个lake的时间置为0
    37             sum=0;
    38             for(int h=1;h<=hour-T[i];h++)//在规定的时间内获取最大值
    39             {
    40                 maxn=0;
    41                 for(int k=0;k<=i;k++ )//寻找单位时间内最大的钓鱼量
    42                 {
    43                     if(maxn<K[k].fish){maxn=K[k].fish;p=k;}
    44                 }
    45                 sum+=maxn;
    46                 if(maxn>0)
    47                 {
    48                     K[p].fish-=K[p].decrease;K[p].stay++;//在最大值的地方加上滞留时间,并把鱼量减小
    49                  }
    50                  else K[0].stay++;//如果没有找到,则在第一个湖那边加1;
    51 
    52             }
    53             if(sum>flag)
    54             {flag=sum;
    55              for(int j=0;j<=n;j++)
    56              k_stay[j]=K[j].stay*5;  //这里只对全部鱼量不全为0的情况,故下面在输出结果时要考虑flag是否为0
    57             }
    58         }
    59         if(flag == 0){
    60             printf("%d", hour*5);
    61             for(int i=1; i<n; i++)
    62                 printf(", %d", 0);
    63             printf("
    Number of fish expected: %d
    
    ", flag);
    64         }
    65         else{
    66        for(j=0;j<n-1;j++)
    67             printf("%d, ",k_stay[j]);
    68             printf("%d
    ",k_stay[n-1]);
    69        printf("Number of fish expected: %d
    
    ",flag);//注意输出格式
    70     }
    71     }
    72     return 0;
    73 }
  • 相关阅读:
    范仁义html+css课程---7、表单
    范仁义html+css课程---6、表格
    范仁义html+css课程---5、列表
    范仁义html+css课程---4、文本标签
    范仁义html+css课程---3、图片和超链接
    react项目如何运行
    maven search
    PowerDesigner中Name与Code同步的问题
    PowerDesigner跟表的字段加注释
    MobilePhone正则表达式
  • 原文地址:https://www.cnblogs.com/khbcsu/p/3885490.html
Copyright © 2020-2023  润新知