![题面](https://i-blog.csdnimg.cn/blog_migrate/fd11c73142c4e3aaf85e1a336362f649.png)
题意:公主速度为 vp,恶龙速度为 vd,公主先跑 t 时间后恶龙开始追,每当恶龙追上公主的时候公主可以用一枚硬币让恶龙原路返回,并在原点待 f 时间后再重新追她,问公主一直跑到距离原点为c的终点一共需要准备多少个硬币。
思路:我是直接模拟的,恶龙跑的距离为dd,公主跑的距离为dp,恶龙每次被硬币耽误的时间是 dd / vd + f ,这时候给恶龙的距离清零(送回原点)。思路很好想,主要问题是时间并不是每次都是1个单位。举个例子,vp = 1, vd = 1000 , t = 1 那么这时候如果像我一样想当然地在计算恶龙耽误的时间time的时候写的 time = vp * timenow / vd ,那么对于这个极大的vd来说它其实只用了0.001的时间就追上了,如果你这时候用的是int型那就直接没了,这就肯定不对【第一个坑】,但是就算你用了double其实后面还会被卡毕竟有精度问题,所以我找大佬要了数据又改了好几个小时后发现,需要每次循环的时候你自己给他每一个单位的时间再细分成若干个小的时间段【第二个坑】,这样会加大时间复杂度但是因为这个题它的数据比较小所以就没关系可以这么做。我这种做法确实不是最好的,改代码的时候也看了别人的,下面贴上我觉得很好的解法:https://www.cnblogs.com/zcy19990813/p/9702829.html
代码:
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int main(void)
{
int vp,vd,t,f,c;
cin>>vp>>vd>>t>>f>>c;
int ans = 0;
double T = c / vp;
if(t >= T || t + c / vd >= T)
{
cout<<ans<<endl;
}else{
double dp = t * vp;
double dd = 0.0;
while(dp < c)
{
if(dd >= dp)//只要恶龙追上了公主
{
ans ++;
double time = max(dd,dp) / vd + f;
dp += time * vp;
dd = 0.0;
}else{
dp += vp * 0.001;
dd += vd * 0.001;
}
}
cout<<ans<<endl;
}
return 0;
}