http://acm.hdu.edu.cn/showproblem.php?pid=2059
//4427480 2011-08-16 15:40:49 Accepted 2059 15MS 176K 1191 B C ylwh!
//4427520 2011-08-16 15:43:31 Accepted 2059 0MS 176K 1301 B C ylwh!
#include <stdio.h>
#include <string.h>
#define N 102
#define MAX 99999
int d[N], VT1, VT2, VR, n, C, L;
float tt[N], T;
float fun(int x, int y, int * z)
{
float ans = 0;
if(x <= y)
{
ans = x * 1.0 / VT1;
*z = y - x;
}
else
{
*z = 0;
ans = y * 1.0 / VT1 + (x - y) * 1.0 / VT2;
}
return ans;
}
int main()
{
int i, j, k, pre, left1, left2, left[N], temp;
float temp1, temp2, ans;
while(scanf("%d", &L)!= EOF)
{
scanf("%d%d%f", &n, &C, &T);
scanf("%d%d%d", &VR, &VT1, &VT2);
for(i=1; i<=n; i++)
scanf("%d", &d[i]);
tt[1] = fun(d[1], C, &left[1]);
d[n+1] = L;
for(i=2; i<=n+1; i++)
{
tt[i] = MAX;
for(j=i-1; j >= 1; j--)//刚开始只根据上一个点的状况更新,后来CW说这样肯定不对,就简单推了一下发现...真的不对,假设判断第i+1个站点的状况时,如果存在left<d[i+1]-d[i-1]<C,如果再加上T非常小的话就会出错。
{
temp1 = fun(d[i] - d[j], left[j], &left1) + tt[j];
temp2 = fun(d[i] - d[j], C, &left2) + T + tt[j];
if(temp1 < temp2 && temp1 < tt[i] )
{
tt[i] = temp1;
temp = left1;
}
else if(temp2 < temp1 && temp2 < tt[i])
{
tt[i] = temp2;
temp = left2;
}
if(d[i] - d[j] > C)//根据上边的判断,只需要由i之前C长度内的站点的状态更新i即可
break;
}
left[i] = temp;
}
ans = tt[n+1];
if(ans > L * 1.0 / VR)
printf("Good job,rabbit!\n");
else
printf("What a pity rabbit!\n");
}
return 0;
}