Escape 题解

题面
题面
​​​​​

 

题意:公主速度为 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;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值