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