D - Vacation HDU - 6581(思维题+基础物理)

在这里插入图片描述
在这里插入图片描述
这道题最关键的地方在这:
在这里插入图片描述
意思就是这些车的距离是0;
并且无论你开多快,你只能和前面的并起走;
然后求车头过终点线的最短时间;
题目的案例给的是每个车的长度l和每个车头部距离终点长度s和他能行驶的最大速度v;
那么最好想的一种就是这个距离终点最远的车单独自己到达终点时那么时间就是t=s0/v0;
但是如果这辆车和他前面的车相连接后,那么他的速度一定会减小(因为能和前面车想链接说明肯定原速度更大);所以他会跟着他前面的车一直到终点,那么因为在连接之前他们是同时间在走,所以最后影响时间的就是前面和他连接的车,比如这种:在这里插入图片描述
那么时间肯定就等于L1所运动的时间(注意这里需要加上L1);这里可以在头脑里面动态想一想就明白了;同样按照这种推理,那么我只需要记录每个车到终点所用时间的最大值就够了,因为合并之后肯定会被前面的慢的影响,慢的自然时间就大了,所以这就能解释清楚了;这里还有一点需要注意:就是我在算t时我是里面包含的车的长度;意思就是这个意思:
在这里插入图片描述
动态想一想应该可以理解的;
这里就把多走的时间算出来
AC代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
double eps=1e-8;
const int maxn=1e5+10;
ll Mod=998244353;
ll gcd(ll a,ll b){
    return b?gcd(b,a%b):a;
}
struct Car{
    int l,s,v;
}car[maxn];
int main(){
    int n;
    while(~scanf("%d",&n)){
          for(int i=0;i<=n;i++)scanf("%d",&car[i].l);//输入L
          for(int i=0;i<=n;i++)scanf("%d",&car[i].s);//输入S
          for(int i=0;i<=n;i++)scanf("%d",&car[i].v);//输入最大V
          double ans=(car[0].s)*1.0/(car[0].v*1.0);//这种是他独自跑完,意思就是不比前面车的速度都慢
          double length=0;//这里用来记录L的累加结果
          for(int i=1;i<=n;i++)length+=car[i].l*1.0,ans=max(ans,(length+car[i].s)*1.0/(1.0*car[i].v));//因为按照后面的车的到达时间之后,但是此时最远的车并未到达;
          printf("%0.8lf\n",ans);
    }
    
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值