Problem B - Subway

Problem B - Subway

时间: 1ms        内存:128M

描述:

Problem B - Subway

Subway trains are meant to move people as quickly, safely, and comfortably as possible from station to station. Although the train drivers' unions may not agree, computer operated trains accomplish these goals more effectively than human operated trains. You are to determine the optimal control strategy to move the train from one station to another within the constraints imposed by safety and comfort considerations, as well as the physical limitations of the train itself.

The parameters to the problem are all positive integers not greater than 1000.

  • d - the distance between stations, in metres
  • m - the maximum allowable speed of the train, in metres/sec
  • a - the maximum absolute acceleration of the train, in metres/sec2
  • j - the maximum absolute jerk, in metres/sec3

The train must be completely stopped at each station and must move in one direction at speeds not exceeding m. Acceleration can be positive (forward) or negative (backwards) but its absolute value must not exceed a. The last parameter, jerk, is the rate of change of acceleration in either direction. That is, acceleration cannot increase or decrease at greater than this rate. This parameter prevents toppling the standing passengers.

There are several test cases. For each test case, standard input has a single line with d, m, a, j. For each test case, standard output should contain a single line giving the minimum time in seconds, to the nearest 0.1 second, required to move between the stations.

输入:

输出:

示例输入:

1000 70 20 1

示例输出:

31.7

提示:

参考答案(内存最优[764]):

#include <stdio.h>
#include <math.h>

double D,M,A,J,jtime, jtimeaccellimit, jtimespeedlimit, jtimedistlimit,
               atime, dist, delta, a, b, c, r;

double cubrt(double x) {
   return (exp(log(x)/3));
}

main(){
   while (4 == scanf("%lf%lf%lf%lf",&D,&M,&A,&J)) {
      jtimeaccellimit = A/J;
      jtimespeedlimit = sqrt(M/J);
      jtimedistlimit = cubrt(D/2/J);
      jtime = jtimeaccellimit;
      if (jtimespeedlimit < jtime) jtime = jtimespeedlimit;
      if (jtimedistlimit < jtime) jtime = jtimedistlimit;
      atime = (M - J*pow(jtime,2))/A;
      a = 0.5*A;
      b = A*jtime + 0.5*J*pow(jtime,2);
      c = J * pow(jtime,3) - D/2;
      r = (-b + sqrt(b*b - 4*a*c))/2/a;
      if (r < atime) atime = r;
      dist = J * pow(jtime,3) 
             + 0.5*J*pow(jtime,2)*atime + 0.5*A * pow(atime,2) 
             + A * atime*jtime;
      printf("%0.1lf\n",4*jtime+2*atime+2*(D/2-dist)/M);
   }
}

参考答案(时间最优[1]):

#include <stdio.h>
#include <math.h>

double D,M,A,J,jtime, jtimeaccellimit, jtimespeedlimit, jtimedistlimit,
               atime, dist, delta, a, b, c, r;

double cubrt(double x) {
   return (exp(log(x)/3));
}

main(){
   while (4 == scanf("%lf%lf%lf%lf",&D,&M,&A,&J)) {
      jtimeaccellimit = A/J;
      jtimespeedlimit = sqrt(M/J);
      jtimedistlimit = cubrt(D/2/J);
      jtime = jtimeaccellimit;
      if (jtimespeedlimit < jtime) jtime = jtimespeedlimit;
      if (jtimedistlimit < jtime) jtime = jtimedistlimit;
      atime = (M - J*pow(jtime,2))/A;
      a = 0.5*A;
      b = A*jtime + 0.5*J*pow(jtime,2);
      c = J * pow(jtime,3) - D/2;
      r = (-b + sqrt(b*b - 4*a*c))/2/a;
      if (r < atime) atime = r;
      dist = J * pow(jtime,3) 
             + 0.5*J*pow(jtime,2)*atime + 0.5*A * pow(atime,2) 
             + A * atime*jtime;
      printf("%0.1lf\n",4*jtime+2*atime+2*(D/2-dist)/M);
   }
}

题目和答案均来自于互联网,仅供参考,如有问题请联系管理员修改或删除。

点赞

发表评论

电子邮件地址不会被公开。必填项已用 * 标注