poj 1042 贪心

来源:互联网 发布:刘备是汉室宗亲吗 知乎 编辑:程序博客网 时间:2024/05/01 18:19

题意:有n个湖,每个湖有一个初始的鱼量Fi,每个湖中鱼的数量会以di的速率不断下降,未到的湖其鱼量不变。这n个湖排成一排,只能从标号小的湖走向标号大的湖。从第一个湖开始每个单位时间可以选择钓鱼或者往下一个湖走。给定总时间h,问最多能钓到多少鱼。
思路:枚举经过的湖的数量。在每种湖数量给定的情况下,贪心选鱼。即选择能钓到最多鱼的湖。

#include <stdio.h>#include <string.h>#define N 26int f[N],F[N];//F数组为每个湖中原始的鱼的数量int d[N];//d数组为每个湖每隔5分钟减少的鱼的数量int t[N];//t[i]为从i-1个湖走到第i个湖所需的时间int res[N],RES[N];//保存结果,即第i个湖钓多长时间int n,h,H,end,max,sum;int main(){freopen("a.txt","r",stdin);while(scanf("%d",&n)&&n){int i,j;memset(RES,0,sizeof(RES));max = 0;scanf("%d",&H);H *= 12;//题意都是以5分钟为单位,这里转化成每单位RES[0] = H;//赋予初值(有可能每个湖里都没有鱼,此时时间都用在第一个湖上)for(i = 0;i<n;i++)scanf("%d",&F[i]);for(i = 0;i<n;i++)scanf("%d",&d[i]);for(i = 1;i<n;i++)scanf("%d",&t[i]);for(end = 0;end<n;end++){//表示从第1个湖到第k个湖捕鱼(为k时表示k个湖都会达到)h = H;sum = 0;memset(res,0,sizeof(res));for(i = 1;i<=end;i++)//先把途中用到的时间刨去,只对捕鱼的时间贪心运算h -= t[i];for(i = 0;i<=end;i++)f[i] = F[i];if(h <= 0)break;while(h--){//如果有时间,就从鱼的数量最多的那个湖中打渔。for(i = 1,j = 0;i<=end;i++)if(f[i] > f[j])j = i;sum += f[j];//记录总的打渔数量f[j] -= d[j];//鱼的数量的变化f[j] = f[j]<0?0:f[j];res[j] ++;}if(sum > max){max = sum;for(i = 0;i<=end;i++)RES[i] = res[i];}}for(i = 0;i<n-1;i++)printf("%d, ",RES[i]*5);printf("%d\n",RES[n-1]*5);printf("Number of fish expected: %d\n\n",max);}return 0;}


0 0
原创粉丝点击