文章标题 CSU 1859: Gone Fishing(贪心)

来源:互联网 发布:php类自调用函数 编辑:程序博客网 时间:2024/04/30 18:28

1859: Gone Fishing

题目链接
题意:给出很多个鱼塘,告诉你每个鱼塘的初始鱼的数量,还有每个鱼 塘每五分钟鱼游走的鱼的数量以及每五分钟能够钓到的鱼的数量。 每个鱼塘之间有距离。然后问在一定时间内,能够最多能钓鱼多 少只,并且把在每个鱼塘停留钓鱼的时间输出,而且要求在第一 个鱼塘尽量呆的久。
分析:贪心,如果我们已经确定在号鱼塘内钓鱼,事先减去再 路上花费的时间。那么我们就不用管钓鱼的前后关系了。即先去 号鱼塘钓鱼,再去号鱼塘钓鱼,再去号鱼塘钓鱼这些路上的 时间不用再计算了。相当于可以随便钓,然后问最多钓多少鱼。 很显然,我们用贪心思想,每次取当前能够钓鱼数量最多的那个 鱼塘即可。
代码:

#include<iostream>#include<string>#include<cstdio>#include<cstring>#include<vector>#include<math.h>#include<map>#include<queue> #include<algorithm>using namespace std;const int inf = 0x3f3f3f3f;int n,h;int f[30];int tmp_f[30];int t[30];//岛与岛之间之间花费的时间 int d[30];//每呆单位时间鱼减掉的数目 int rec[30],rec_tmp[30]; int main (){    int flag=0;    while (scanf ("%d",&n)){        if (n==0)break;        if (flag)printf ("\n");        else flag=1;        int ans=0;        scanf ("%d",&h);        h*=12;//总时间        for (int i=1;i<=n;i++){            scanf ("%d",&f[i]);            tmp_f[i]=f[i];        }         for (int i=1;i<=n;i++){            scanf ("%d",&d[i]);        }        t[0]=0;        for (int i=1;i<=n-1;i++){            scanf ("%d",&t[i]);            t[i]+=t[i-1];//求到达第i+1个岛在路上花费的总时间         }        for (int i=1;i<=n;i++){            //走到第i个岛,先将路上的时间给减掉,然后剩下的就是可以在岛屿上呆的时间             int tt=h-t[i-1];            //cout<<"tt="<<tt<<endl;            if(tt<0)break;             memset(rec_tmp,0,sizeof (rec_tmp));             int ans1=0;            int Max=0,place=1;            for (int j=1;j<=n;j++) tmp_f[j]=f[j];//每次从新赋值原始的鱼的数量             for (int k=0;k<tt;k++){                Max=0;place=1;//在前i个岛中找到能钓到最多的鱼                 for (int j=1;j<=i;j++){                    if (Max<tmp_f[j]){                        Max=tmp_f[j];                        place=j;                    }                }                ans1+=Max;//总数加上                 tmp_f[place]-=d[place];//然后这个岛能钓到的鱼减掉d                 rec_tmp[place]++;//在岛呆的时间加一                 if (tmp_f[place]<0)tmp_f[place]=0; //如果小于0说哦名下次钓不到鱼,置零             }            if (ans1>ans){                ans=ans1;                for (int j=1;j<=n;j++){//保存在每个岛呆的时间                     rec[j]=rec_tmp[j];                }            }        }        for (int i=1;i<=n;i++){            if (i==1)printf ("%d",rec[i]*5);            else printf (", %d",rec[i]*5);         }         printf ("\n");        printf ("Number of fish expected: %d\n",ans);    }           return 0;}
原创粉丝点击