hdu2175 两车追及或相遇问题

/...................................................................................................................................................................................................................................................................................................................\

貌似这个题在杭电上交的人数不太多哦,开始没想明白,想明白了原来是一个圆周追击与相遇问题,可以将题目中到达对面立即掉头理解为一个圆周运动,因为可以认为题目中连接2个城市的公路为双向车道,当考虑追击与相遇可以分开考虑,追击时候理解的路线图为
→→→→→→→→→→→→→→
↑ ↑→→→→→→→→→→→→↓ ↓      
↑ ↑                                          ↓ ↓               
↑ ↑←←←←←←←←←←←←↓ ↓     
←←←←←←←←←←←←←← 
        开始的时候可以A在左边,B在右边,则为一个距离为半个圆周的追击问题,圆周长为2倍的甲乙间距离当第一次追击 成功后便改变为距离为一个圆周的追击问题, 这个时候可以发现从第二次开始以后每次追击距离都是一个圆周,则追击周期为第一追击耗时的两倍, 从第一次求第二次乃至以后的N次都是增加这个周期就能得到               
        当寻找相遇时可以让车辆改变行驶的车道,因为刚才图中依然能够理解到相遇,即对面行驶不同车道相遇,改变车道对追击与相遇不产生影响,但便于理解
→→→→→→→→→→→→→→
↑ ↓←←←←←←←←←←←←↑ ↓               
↑ ↓                                          ↑ ↓       
↑ ↓→→→→→→→→→→→→↑ ↓
←←←←←←←←←←←←←←
       该图表示时可以理解为一个距离为半个圆周的相遇问题,当第一次相遇后可以改变为距离为一个圆周的相遇问题,此时跟上述原理一样,从第一次求第二次开始每次增加第一次耗时的两倍,按照周期则可求得N次相遇的时间
       追击与相遇的分别的第N次时间已经可求,那给定总的第N次时间和最短距离便能搞定了

\.................................................................................................................................................................................................................................................................................................................../




#include<stdio.h>

int main()
 {
      int a,n,i;
      double v1,v2,time1,time2,t1,t2,l1,l2,min,s;
      scanf("%d",&n);
      while(n--)
      {
          scanf("%lf%lf%lf%d",&s,&v1,&v2,&a);
          time1=s/(v1+v2);
          if(v1>v2)
          time2=s/(v1-v2);
          else if(v1<v2)
          time2=s/(v2-v1);
          else
          time2=0;
          t1=-time1;
          t2=-time2;
          for(i=1;i<=a;i++)
          {
              if(t1+2*time1<t2+2*time2||t2==0)
              {
                  t1+=2*time1;
                  min=t1;
              }
              else if(t2+2*time2<t1+2*time1)
              {
                  t2+=2*time2;
                  min=t2;
              }
          }
          l1=v1*min;
          while(l1>=s*2)l1-=2*s;
          if(l1>=s)l1=2*s-l1;
          l2=s-l1;
          if(l2<l1)
          l1=l2;
          printf("Time=%.3lf Dist=%.3lf\n",min,l1);
      }
      return 0;
 }


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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值