<?php
function calcTravelTime($acc, $deAcc, $maxSpeed, $dist) {
// case 1 min-distance
$accTime = $maxSpeed / $acc;
$deAccTime = $maxSpeed / $deAcc;
$accDist = 0.5 * $acc * pow($accTime, 2);
$deAccDist = 0.5 * $deAcc * pow($deAccTime, 2);
$result = -1;
if ($dist - $accDist - $deAccDist >= 0)
{ // case 1
$maxSpeedDist = $dist - $accDist - $deAccDist;
$maxSpeedTime = $maxSpeedDist / $maxSpeed;
$result = ($accTime + $maxSpeedTime + $deAccTime) * 1000;
}
else
{ // case 2
$accTime = sqrt($dist / ($acc / 2 + ($deAcc / 2) * pow($acc / $deAcc, 2)));
$deAccTime = ($acc * $accTime) / $deAcc;
$result = ($accTime + $deAccTime) * 1000;
}
return (int) ($result + 1);
}
$input = file("input/" . $GLOBALS["argv"][1] . ".txt");
foreach ($input as &$l)
{
$l = explode(" ", $l);
}
$acc = floatval($input[0][0]);
$maxSpeed = floatval($input[0][1]);
$deAcc = floatval($input[0][2]);
$nReq = floatval($input[1][0]);
$time = 0;
$lastFloor = 0;
for ($i = 0;$i < $nReq;$i++)
{
$tDiff = $input[$i + 2][2] - $time;
if ($tDiff > 0)
{
// echo "last was finished at " . $time . " so we wait " . $tDiff . " for new input\n";
$time += $tDiff;
}
// echo "new request is on floor " . $input[$i + 2][0] . " so we go there until ";
$time += $lastFloor != $input[$i + 2][0] ? calcTravelTime($acc, $deAcc, $maxSpeed, abs($lastFloor - $input[$i + 2][0]) * 4.5) : 0;
// echo $time . "\n";
$time += calcTravelTime($acc, $deAcc, $maxSpeed, abs($input[$i + 2][0] - $input[$i + 2][1]) * 4.5);
// echo "and then travel until ";
echo $time . " ";
$lastFloor = $input[$i + 2][1];
}
?>