POJ 1042 Gone Fishing【枚举+贪心】
题意: 有 n 个池塘,只能从第一个池塘开始走,可以在每个池塘中钓鱼,而且知道了每个池塘每五分钟钓鱼的数量都会下降一定额数值,且从池塘到下一个池塘之间都有一定的距离,知道了每个池塘走到下一个池塘的时间和每个池塘一开始能够钓鱼的数量,求在规定的时间内所能钓的最多的鱼的数量。
分析: 枚举以每个池塘为终点的情况,找到最大值。
有个注意的地方就是,没枚举一个终点,先把这段路的每个间隔所花时间去掉,这样就可以每次贪心去找单位时间可以钓最多的鱼了,而且可以保证贪心到最后可以找到最优解。
#include<cstdio> #include<cstring> #define clr(x)memset(x,0,sizeof(x)) struct node { int f; // 开头 5 分钟钓的鱼数量 int d; // 每五分钟减少的数量 int dis; // 到下一个池塘的时间 }l[202]; int a[202]; // 保存每个池塘一开始可以钓的鱼 int tim[202][2500]; int res[202]; int main() { int n,i,j,k,t,tot,tt,max; while(scanf("%d",&n),n) { clr(a); clr(tim); clr(res); scanf("%d",&t); tot=t*12; for(i=0;i<n;i++) scanf("%d",&l[i].f); for(i=0;i<n;i++) scanf("%d",&l[i].d); for(i=0;i<n-1;i++) scanf("%d",&l[i].dis); for(i=0;i<n;i++) { t=tot; for(j=0;j<i;j++) t-=l[j].dis; for(j=0;j<=i;j++) a[j]=l[j].f; for(j=0;j<t;j++) { max=a[0]; tt=0; for(k=0;k<=i;k++) if(a[k]>max) { max=a[k]; tt=k; } a[tt]-=l[tt].d; res[i]+=max; if(a[tt]<0) a[tt]=0; tim[i][tt]++; } } max=res[0]; tt=0; for(i=1;i<n;i++) if(res[i]>max) { max=res[i]; tt=i; } for(i=0;i<n-1;i++) printf("%d, ",tim[tt][i]*5); printf("%d\n",tim[tt][i]*5); printf("Number of fish expected: %d\n\n",max); } return 0; }