AtCoder ABC 076D - AtCoder Express
传送门:http://abc076.contest.atcoder.jp/tasks/abc076_d
本题是一个运动学问题——匀变速运动。
一个质点,从静止开始运动。按照速度限制,可将运动划分成n个阶段,第i个阶段的时间为ti s,速度上限为vi m/s。已知这个质点的加速度大小只取0或±1m/s2。以及,质点在最初和最终的时刻速度为0。求质点的最大位移。
以下变量均采用国际单位制。
对于运动某一个阶段(例如第i个阶段),可以分成三个子阶段:匀加速运动、匀速运动和匀减速运动。记三个子阶段的时间分别为inc、kep、dec,则inc+kep+dec=t[i]。记下一个阶段的限速为lim,则:
- 匀加速阶段:inc=min{vi-cur,(lim+t[i]-cur)/2,t[i]};
- 匀减速阶段:dec=max{0,cur+inc-lim};
- 匀速阶段:kep=t[i]-inc-dec。
于是,分别对这三段时间计算位移,求和即可。时间复杂度为O(n2),空间复杂度为O(n)。
参考程序如下:
- #include <stdio.h>
- #define MAX_N 101
- double t[MAX_N], v[MAX_N];
- double max(double a, double b)
- {
- return a > b? a: b;
- }
- double min(double a, double b)
- {
- return a < b? a: b;
- }
- int main(void)
- {
- int n;
- scanf("%d", &n);
- for (int i = ; i < n; i++)
- scanf("%lf", &t[i]);
- for (int i = ; i < n; i++)
- scanf("%lf", &v[i]);
- double cur = .;
- double ans = .;
- for (int i = ; i < n; i++) {
- double inc, kep, dec;
- double lim = .E8;
- double tmp = .;
- for (int j = i + ; j <= n; j++) {
- lim = min(lim, v[j] + tmp);
- tmp += t[j];
- }
- inc = min(v[i] - cur, (lim + t[i] - cur) * .);
- inc = min(inc, t[i]);
- dec = max(., cur + inc - lim);
- kep = t[i] - inc - dec;
- ans += . * (cur * . + inc) * inc;
- ans += (cur + inc) * kep;
- ans += . * ((cur + inc) * . - dec) * dec;
- cur += inc;
- cur -= dec;
- }
- printf("%f\n", ans);
- return ;
- }
本题也可以从以下角度考虑:
仅考虑一个区间:若在时间区间[l,r]上的速度上限为v,则在整个时间区间[0,T]上,速度上限函数为
$$f(t)=\begin{cases} v+(l-t),0\le t<l\\v,l\le t\le r\\v+(t-r),r<t\le T\end{cases}$$
其中,$T=\sum_{i=1}^{n}t_i$。
对于阶段i,对应的时间区间为$[\sum_{j=1}^{i-1}t_j , \sum_{j=1}^{i}t_j ]$,速度上限为vi,相应的速度上限函数记为fi(t)。考虑所有的区间,则速度上限函数为$f(t)=\min\{t,T-t,f_{i}(t)|1\le i\le n\}$。
由于vi、ti均是正整数,因此可以将t轴的最小单位设置为Δt=0.5s。可以假定从0时刻开始,在每一个Δt=0.5s内,质点的加速度是恒定的。则以Δt=0.5s为单位,用f(t)刻画质点运动的v-t图像,并用加速度的限制条件修正v(t)。通过质点运动的v-t图像计算其最大位移(即v-t曲线与t轴围成的图形面积)。时间复杂度为O(nT),空间复杂度为O(n+T)。
参考程序如下:
- #include <stdio.h>
- #define MAX_N 100
- #define MAX_T 40000
- int t[MAX_N];
- double v[MAX_N], f[MAX_T];
- double min(double a, double b)
- {
- return a < b? a: b;
- }
- int main(void)
- {
- int n;
- scanf("%d", &n);
- for (int i = ; i < n; i++)
- scanf("%d", &t[i]);
- for (int i = ; i < n; i++)
- scanf("%lf", &v[i]);
- for (int i = ; i < MAX_T; i++)
- f[i] = .E8;
- int tot = ;
- for (int i = ; i < n; i++) {
- t[i] *= ;
- for (int j = tot; j <= tot + t[i]; j++)
- f[j] = min(f[j], v[i]);
- tot += t[i];
- }
- f[] = f[tot] = .;
- for (int i = ; i <= tot; i++)
- f[i] = min(f[i], f[i - ] + .);
- for (int i = tot - ; i >= ; i--)
- f[i] = min(f[i], f[i + ] + .);
- double ans = .;
- for (int i = ; i < tot; i++)
- ans += . * (f[i] + f[i + ]);
- printf("%f\n", ans);
- return ;
- }
AtCoder ABC 076D - AtCoder Express的更多相关文章
- ATCODER ABC 099
ATCODER ABC 099 记录一下自己第一场AK的比赛吧...虽然还是被各种踩... 只能说ABC确实是比较容易. A 题目大意 给你一个数(1~1999),让你判断它是不是大于999. Sol ...
- Atcoder ABC 141
Atcoder ABC 141 A - Weather Prediction SB题啊,不讲. #include<iostream> #include<cstdio> #inc ...
- Atcoder ABC 139E
Atcoder ABC 139E 题意: n支球队大循环赛,每支队伍一天只能打一场,求最少几天能打完. 解法: 考虑抽象图论模型,既然一天只能打一场,那么就把每一支球队和它需要交手的球队连边. 求出拓 ...
- Atcoder ABC 139D
Atcoder ABC 139D 解法: 等差数列求和公式,记得开 $ long long $ CODE: #include<iostream> #include<cstdio> ...
- Atcoder ABC 139C
Atcoder ABC 139C 题意: 有 $ n $ 个正方形,选择一个起始位置,使得从这个位置向右的小于等于这个正方形的高度的数量最多. 解法: 简单递推. CODE: #include< ...
- Atcoder ABC 139B
Atcoder ABC 139B 题意: 一开始有1个插口,你的插排有 $ a $ 个插口,你需要 $ b $ 个插口,问你最少需要多少个插排. 解法: 暴力模拟. CODE: #include< ...
- Atcoder ABC 139A
Atcoder ABC 139A 题意: 给你两个字符串,记录对应位置字符相同的个数 $ (n=3) $ 解法: 暴力枚举. CODE: #include<iostream> #inclu ...
- atcoder abc 244
atcoder abc 244 D - swap hats 给定两个 R,G,B 的排列 进行刚好 \(10^{18}\) 次操作,每一次选择两个交换 问最后能否相同 刚好 \(10^{18}\) 次 ...
- AtCoder ABC 250 总结
AtCoder ABC 250 总结 总体 连续若干次一样的结果:30min 切前 4 题,剩下卡在 T5 这几次卡在 T5 都是一次比一次接近, 什么 dp 前缀和打挂,精度被卡,能水过的题连水法都 ...
随机推荐
- SpringMVC + MyBatis 配置文件
web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="htt ...
- How to use shared model by git in sql source control of red gate
1.clone the git repository for datbase 2.open sql source control window and select the target databa ...
- VMware Tools的安装
mkdir /mnt/cdrom 首先创建一个文件夹mount /dev/cdrom /mnt/cdrom 然后挂载 这样的话,就可以看到 /mnt/cdrom文件夹下有文件了 ls /mnt ...
- CodeForces - 789D Weird journey
D. Weird journey time limit per test 2 seconds memory limit per test 256 megabytes input standard in ...
- hash哈希
我复习的时候,突然发现没写过hash算法,惊讶!!!赶紧补一下. 把字符串看成base进制的数.Hash值比较就是为了判断是否有相同的字符串.(base是自己定义的大于26的质数,个人认为大一点比较好 ...
- Coursera Algorithms week2 栈和队列 练习测验: Stack with max
题目原文: Stack with max. Create a data structure that efficiently supports the stack operations (push a ...
- [Apple开发者帐户帮助]三、创建证书(6)创建创建VoIP服务证书
VoIP:基于IP的语音传输(英语:Voice over Internet Protocol,缩写为VoIP)是一种语音通话技术,经由网际协议(IP)来达成语音通话与多媒体会议,也就是经由互联网来进行 ...
- 浅谈自学Python之路(day3)
今天的主要内容是: 撒 文件操作 对文件操作的流程: 打开文件,得到文件句柄并赋值给一个变量 通过句柄对文件进行操作 关闭文件 现有文件如下: tonghuazhen 听说白雪公主在逃跑 小红帽在担心 ...
- C# 取两位小数
double s=0.55555;result=s.ToString("#0.00");//点后面几个0就保留几位 如果要四舍五入的话,用这个double dbdata = 0.5 ...
- POJ 1946 DP
折腾了一晚上 明天再写.. 2016.5.17 23:59 -> -> #include <cstdio> #include <cstring> #include ...