- 题目描述:
乌龟兔子赛跑。兔子以VR的速度匀速奔跑。乌龟骑电动车,当电动车有电时可以以VT1的速度飞驰C米,没电时以VT2的速度骑行。跑道上有N个充电桩,乌龟可以选择充电与否,充电需要T秒。判断兔子能否跑过乌龟。(开始时电动车满电)。
- 思路:
将每一个充电站以及起点终点设为节点。将第n个节点分割成0到i,和i到n两个部分(0<i<n),计算两个局部最优解。比较不同分割法的最优解。寻找全局最优解。
- 细节:
首先是局部最优的实现,局部最优一定是从满电开始的,所以每一个局部最优都一定要加上T,其次是对C与充电站间距离的讨论,第三所有的数据一定是浮点数,必要时需要强制转化。最后每一次循环结束都需要清空数据。
- 源代码:
#include<iostream> #include<cstring> using namespace std; int L,N,C,T; int VR,VT1,VT2; int p[102]; double time[105]; int main() { while(cin>>L) { cin>>N>>C>>T; cin>>VR>>VT1>>VT2; for(int i=1; i<=N;i++) cin>>p[i]; p[0]=0;p[N+1]=L; double min,a; memset(time,0,sizeof(time)); time[0]=0; for(int i=1;i<N+2;i++) { min=10000000000; for(int j=0;j<i;j++) { int len=p[i]-p[j]; if(len>C) { a=1.0*C/VT1+(len-C+0.0)/VT2; } else { a=1.0*len/VT1; } a+=time[j]; if(j) a+=T; if(min>a) min=a; } time[i]=min; } if(1.0*L/VR<time[N+1]) cout<<"Good job,rabbit!"<<endl; else cout<<"What a pity rabbit!"<<endl; } return 0; }