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 前缀和打挂,精度被卡,能水过的题连水法都 ...
随机推荐
- HDU5567/BestCoder Round #63 (div.2) A sequence1 水
sequence1 Given an array a with length n, could you tell me how many pairs (i,j) ( i < j ) for a ...
- 蒟蒻的trie树专题
POJ 3630 Phone List: 模板 ///meek #include<bits/stdc++.h> using namespace std; using namespace s ...
- javase - 点餐系统
public class OrderMsg { public static void main(String[] args) throws Exception { /** * 订餐人姓名.选择菜品.送 ...
- XML案例(使用JAXP进行DOM解析)
1.book.xml <?xml version="1.0" encoding="UTF-8" standalone="no"?> ...
- Spring Data 自动生成
之前一直用的mybatis逆向自动生成,由于最近学习springdata,所以看了一下springdata的自动生成,基本与mybatis一致,不同的也许就是逆向生成代码(实体类,mapper等)和正 ...
- CVTE面经
神一般的面试经历.也算面了不少公司,没见过这种面试. 一面:三个同学对应一个面试官,同一个问题依次作答. 1.为什么投递这个岗位? 答:blablabla... 2.最难忘的成功项目? 答:blabl ...
- ACM_城市交通线(简单并查集)
城市交通线 Time Limit: 2000/1000ms (Java/Others) Problem Description: A国有n座城市,编号为1~n,这n个城市之间没有任何交通线路,所以不同 ...
- SSIS 无法在 unicode 和非 unicode 字符串数据类型之间转换
最近在学SSIS,遇到一个问题,把平面文件源的数据导入到EXCEL中. 平面文件源的对象是CSV,读进来的PhoneNumber是 DT_STR 然后倒入Excel 对应列建立的是longtext 一 ...
- 配置 Sybase数据源
1.Start-- > All Programs -- > Sybase - -> Connectivity --> click ‘Open Client Directory ...
- hadoop单机环境配置
1.配置一台linux服务器(当前使用CentOS7)及一些基本设置 1.1在wmware下制作一台centos服务器(桥接模式) 并设置静态ip (编辑/etc/sysmconfig ...