题目:
枚举加贪心,枚举,从第一个到最后一个,将每一个作为最后结束钓鱼的池塘,这样就可以将从1走到最后结束的池塘的时间从总时间里减去,
剩下的时间就是钓鱼的时间,然后每次选出在i池塘可以钓到最大鱼数的池塘,一直循环,直到池塘没鱼(将剩下的时间全部给第一个池塘,也就是耗时间)
或者没时间,直接结束本次枚举。
其实这样处理就相当与在各个池塘之间瞬移,实际是做不到的,只是可以将问题抽象化成这样,这样,每次钓到的鱼都是最多的,最后回归到现实,将钓鱼的
次数从左到右分配给每个池塘,这样得出来的结果是最优化的。
转自别人代码:
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
const int N = 30;
int f[N], d[N], ans[N], tmp[N], time[N];
int ff[N];
int main()
{
int n, h, i, j, t, cas = 0;
while(~scanf("%d",&n) && n)
{
scanf("%d",&h); h *= 60;
for(i = 0; i < n; i++)
scanf("%d",&f[i]);
for(i = 0; i < n; i++)
scanf("%d",&d[i]);
time[0] = 0;
for(i = 1; i < n; i++)
{
scanf("%d",&t);
time[i] = time[i-1] + t*5;
}
memset(ans, 0, sizeof(ans)); //注意初始化
int maxsum = -1;
for(i = 0; i < n; i++)
{
int sum = 0, left_time = h - time[i];
for(j = 0; j <= i; j++)
ff[j] = f[j]; //注意不要直接对f[i]进行操作,不然会影响下一次的结果
memset(tmp, 0, sizeof(tmp));
while(left_time > 0)
{
int mmax = 0, id = 0;
for(j = 0; j <= i; j++)
{
if(ff[j] > mmax)
{
mmax = ff[j];
id = j;
}
}
if(mmax == 0) break;
sum += mmax;
tmp[id] += 5;
ff[id] -= d[id];
left_time -= 5;
}
if(left_time > 0)
tmp[0] += left_time;
if(sum > maxsum)
{
maxsum = sum;
for(j = 0; j <= i; j++)
ans[j] = tmp[j];
}
}
if(cas > 0)
printf("\n");
printf("%d",ans[0]);
for(i = 1; i < n; i++)
printf(", %d",ans[i]);
printf("\n");
printf("Number of fish expected: %d\n",maxsum);
cas++;
}
return 0;
}