题目地址:点击打开链接
思路:看完题就想写回溯就行了,可是加油站的个数最多取到100,早超时了,貌似17.18左右就超时了,后来就是DP了,直接贴大神地址:点击打开链接,讲的一针见血,思路也非常清
AC代码:
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <queue>
#include <stack>
#include <map>
#include <cstring>
#include <climits>
using namespace std;
int p[110];
double dp[110];
int main()
{
int l,n,c,t,vr,vt1,vt2;
int i,j;
double min1,t1,t2;
while(scanf("%d",&l) != EOF)
{
scanf("%d%d%d",&n,&c,&t);
scanf("%d%d%d",&vr,&vt1,&vt2);
for(i=1; i<=n; i++)
{
scanf("%d",&p[i]);
}
p[0] = 0;
p[n+1] = l;
dp[0] = 0;
for(i=1; i<=n+1; i++)
{
min1 = 10000000;
for(j=0; j<i; j++)
{
if(j)
t2 = t;
else
t2 = 0;
if(p[i]-p[j] > c)//这里是大于
{
t2 += 1.0 * c / vt1 + 1.0 * (p[i] - p[j] - c) / vt2;
}
else
{
t2 += 1.0 * (p[i] - p[j]) / vt1;
}
t2 += dp[j];
if(t2 < min1)
min1 = t2;
}
dp[i] = min1;
}
t1 = 1.0 * l / vr;
if(t1 < dp[n+1])
printf("Good job,rabbit!\n");
else
printf("What a pity rabbit!\n");
}
return 0;
}
错误代码:
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <queue>
#include <stack>
#include <map>
#include <cstring>
#include <climits>
using namespace std;
int p[110];
double dp[110];
int main()
{
int l,n,c,t,vr,vt1,vt2;
int i,j;
double min1,t1,t2;
while(scanf("%d",&l) != EOF)
{
scanf("%d%d%d",&n,&c,&t);
scanf("%d%d%d",&vr,&vt1,&vt2);
for(i=1; i<=n; i++)
{
scanf("%d",&p[i]);
}
p[0] = 0;
p[n+1] = l;
dp[0] = 0;
for(i=1; i<=n+1; i++)
{
min1 = 10000000;
for(j=0; j<i; j++)
{
if(j)//既然是模拟ij之间加油的所有情况,除了刚开始有油不用费时间外,其余的点刚开始加油都得花时间
t2 = t;
if(p[i]-p[j] > c)//这里是大于
{
t2 = 1.0 * c / vt1 + 1.0 * (p[i] - p[j] - c) / vt2;//直接覆盖了,没有加上加油花的时间,这种低级错误也犯
}
else
{
t2 = 1.0 * (p[i] - p[j]) / vt1;
}
t2 += dp[j];
if(t2 < min1)
min1 = t2;
}
dp[i] = min1;
}
t1 = 1.0 * l / vr;
if(t1 < dp[n+1])
printf("Good job,rabbit!\n");
else
printf("What a pity rabbit!\n");
}
return 0;
}