UVA 757 Gone Fishing

UVA_757

    显然钓鱼是不会走回头路的,因为如果走回头路一定不会最优。

    于是我们就可以枚举走到的位置,剩下的问题就是在这些可以到达的河中怎么钓鱼会更优,由于各个河是没有影响的,于是我们就可以枚举可供消耗的时间,在当前时刻一定会选择鱼最多的河去钓,需要注意的是,由于题目对输出的特殊要求,即便当前最多只能钓0条,那么也得去钓。

#include<stdio.h>
#include<string.h>
#define MAXD 30
int N, H, d[MAXD], f[MAXD], t[MAXD], now[MAXD], plan[MAXD], use[MAXD];
long long int max;
void init()
{
int i, j, k;
scanf("%d", &H);
H *= 12;
for(i = 0; i < N; i ++)
scanf("%d", &f[i]);
for(i = 0; i < N; i ++)
scanf("%d", &d[i]);
t[0] = 0;
for(i = 1; i < N; i ++)
{
scanf("%d", &t[i]);
t[i] += t[i - 1];
}
}
int check()
{
int i;
for(i = 0; i < N; i ++)
{
if(use[i] > plan[i])
return 1;
else if(use[i] < plan[i])
return 0;
}
return 0;
}
void change(long long int ans)
{
int i;
if(ans > max || (ans == max && check()))
{
max = ans;
for(i = 0; i < N; i ++)
plan[i] = use[i];
}
}
void solve()
{
int i, j, k, h, num;
long long int ans;
max = -1;
for(i = 0; i < N && t[i] <= H; i ++)
{
h = H - t[i];
ans = 0;
for(j = 0; j <= i; j ++)
now[j] = f[j];
memset(use, 0, sizeof(use));
while(h)
{
num = -1;
for(j = 0; j <= i; j ++)
if(now[j] > num)
{
num = now[j];
k = j;
}
++ use[k];
-- h;
ans += num;
now[k] -= d[k];
if(now[k] < 0)
now[k] = 0;
}
change(ans);
}
printf("%d", plan[0] * 5);
for(i = 1; i < N; i ++)
printf(", %d", plan[i] * 5);
printf("\n");
printf("Number of fish expected: %lld\n", max);
}
int main()
{
int tt = 0;
for(;;)
{
scanf("%d", &N);
if(!N)
break;
init();
if(tt ++)
printf("\n");
solve();
}
return 0;
}


原文地址:https://www.cnblogs.com/staginner/p/2310621.html