[R11C] 匀加速运动
- 难度 入门
- 时限 1s
- 空限 512m
- 数学物理
数据规模:,。
思路
先算出加速到极限速度的时间 。若 ,说明全程匀加速,位移 。否则前 时间匀加速、之后匀速 ,位移
为避免浮点格式化的麻烦,把两种情况都写成分母 的分数 :
- 全程加速:;
- 否则:。
最终输出 拆成整数 + 3 位小数即可,全程整数运算。
复杂度:时间 ,空间 。
仓颉实现
import std.convert.*
import std.env.*
main(): Int64 {
let reader = getStdIn()
let v = reader.readln().getOrThrow().split(" ", removeEmpty: true).map({ p => Int64.parse(p) })
let v0 = v[0]
let a = v[1]
let v1 = v[2]
let t = v[3]
let den = 2 * a
let t1num = v1 - v0
let num = if (t1num >= a * t) {
den * v0 * t + a * a * t * t
} else {
(v1 * v1 - v0 * v0) + den * v1 * t - 2 * v1 * (v1 - v0)
}
var scaled = num * 1000
var milli: Int64
if (scaled >= 0) {
milli = (scaled + den / 2) / den
} else {
milli = (scaled - den / 2) / den
}
let sign = if (milli < 0) { milli = -milli; "-" } else { "" }
let intpart = milli / 1000
let frac = milli % 1000
let f2 = frac / 100
let f1 = (frac / 10) % 10
let f0 = frac % 10
println("${sign}${intpart}.${f2}${f1}${f0}")
return 0
}
要点:
- 把位移统一写成 的整数分数,再按四舍五入取 3 位小数,规避了浮点格式化在语言层面的差异。
- 的判断用 的分子 与 比较,避免除法。