hdu2175 两车追及或相遇问题

来源:互联网 发布:马刺 霍尔特 知乎 编辑:程序博客网 时间:2024/05/22 06:36

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

貌似这个题在杭电上交的人数不太多哦,开始没想明白,想明白了原来是一个圆周追击与相遇问题,可以将题目中到达对面立即掉头理解为一个圆周运动,因为可以认为题目中连接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; }


原创粉丝点击