poj 1042 Gone Fishing 贪心+枚举

http://poj.org/problem?id=1042

        John要以1到n的地点钓鱼,且只能从i点走到i+1点,从i点走到i+1点所花时间为5*ti。开始时每个地点的每五分钟之内可钓到鱼fi只,下一个五分钟会递减di。求在给定的时间内最多能钓到多少鱼。
        枚举钓鱼的结束地点。先总时间减去路上行走所花的时间。接下来我们可以想像为John可以在各个钓鱼地点之间瞬间移动,(从起点到结束点),那么在每个五分钟我们都可以选择钓到最多鱼的地点钓鱼。
       本题要注意,若有多个方案,要以在地点1花费时间多的为答案,若地点1的时间花费相同,则以地点2为基准,以此类推。
#include<stdio.h> #include<stdlib.h> #include<string.h> #include<algorithm> #include<iostream> #include<math.h> using namespace std; int f[30],d[30],t[30]; int n,h; int main() {   int i,j,num,flag,sum,ans[30],H,ff[30],ANS[30];     int max,fish,cas=1;       while(scanf("%d",&n),n)     {   memset(ANS,0,sizeof(ANS));   scanf("%d",&h);   for(i=0;i<n;i++)    scanf("%d",&f[i]);   for(i=0;i<n;i++)            scanf("%d",&d[i]);   for(i=0;i<n-1;i++)   {            scanf("%d",&t[i]);            t[i]*=5;   }           fish=-1;           h*=60;           for(i=0;i<n;i++)           {    H=h;    for(j=0;j<i;j++)     H-=t[j];    for(j=0;j<n;j++)     ff[j]=f[j];        memset(ans,0,sizeof(ans));        sum=0;    while(H>0)    {     max=-1;     flag=-1;     for(j=0;j<=i;j++)     {      if(ff[j]>max)      {       max=ff[j];       flag=j;      }     }     H-=5;     sum+=ff[flag];     ans[flag]+=5;     if(ff[flag]>d[flag])     ff[flag]-=d[flag];     else     ff[flag]=0;     //printf("%d.\n",sum);    }    if(sum>fish)    {     fish=sum;     for(j=0;j<n;j++)      ANS[j]=ans[j];    }    else if(sum==fish)    {     j=0;     while(ANS[j]==ans[j]&&j<=i)     j++;     if(j<=i)     if(ans[j]>ANS[j])     {      for(j=0;j<n;j++)       ANS[j]=ans[j];     }    }        }    if(cas!=1)   printf("\n");   cas++;   printf("%d",ANS[0]);   for(i=1;i<n;i++)   printf(", %d",ANS[i]);   printf("\n");   printf("Number of fish expected: %d\n",fish);  }  return 0; }    
 
posted @ 2011-04-22 23:11  CoderZhuang  阅读(156)  评论(0编辑  收藏  举报