搞了一下午的题目,,,
开始的时候虽然把特殊情况列出来了,(最后答案为0)但是还是错在上面了
犯错的地方我已在代码中标识了出来,,
思路吗,主要是贪心,,
假设在前x个池塘就能得到最大鱼数,,
然后让x从1到n遍历,,,,
这样就避免了路上时间的重复。。从而在目前情况下达到最优。。。。
在我看来难点是怎么 题意把转化成自己清晰的思路。
代码如下:
#include <cstdio>
#define M 30
int n, h, f[M], d[M], t[M], ans[M], te[M];
int maxi (int a, int b, int *A)
{
int ans = 0;
for(int i = a; i <= b; i++) if(A[ans]<A[i])
ans = i;
return ans;
}
int solve(int m)
{
int tmax = h*12-t[m];
int tf[M];
for(int i = 0; i < n; i++) {tf[i] = f[i]; te[i] = 0;}
int ans = 0;
int time = 0;
while(time<tmax)
{
int ti = maxi(0,m,tf);
if(tf[ti]<=0) break;
ans+=tf[ti];
tf[ti]-=d[ti];
te[ti]++;
time++;
}
if(time<tmax) te[0]+=tmax-time;
return ans;
}
int main ()
{
int tt = 0;
while(scanf("%d",&n),n)
{
scanf("%d",&h);
for(int i = 0; i < n; i++) scanf("%d",&f[i]);
for(int i = 0; i < n; i++) scanf("%d",&d[i]);
int temp;
t[0] = 0;
for(int i = 1; i < n; i++) {scanf("%d",&temp); t[i] = temp+t[i-1];}
int max = -1, _ans;//注意max的初始值,不可以为零哦!!
for(int i = 0; i < n; i++)
{
_ans = solve(i);
if(max<_ans)
{
max = _ans;
for(int i = 0; i < n; i++) ans[i] = te[i];
}
}
if(tt++) printf("\n");
for(int i = 0; i < n; i++) i==0?printf("%d",ans[i]*5):printf(", %d",ans[i]*5);
printf("\nNumber of fish expected: %d\n",max);
}
return 0;
}