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("\nNumber of fish expected: %d\n\n", 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("\nNumber of fish expected: %d\n\n", flag);
64         }
65         else{
66        for(j=0;j<n-1;j++)
67             printf("%d, ",k_stay[j]);
68             printf("%d\n",k_stay[n-1]);
69        printf("Number of fish expected: %d\n\n",flag);//注意输出格式
70     }
71     }
72     return 0;
73 }

 

posted @ 2014-08-01 17:28  future_hero  阅读(195)  评论(0编辑  收藏  举报