#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int N = 1e5 + 10, INF = 2e9;
int x[N], a[N], b[N];
// a数组是传送前的数组,b数组是传送后的数组
int n;
double f[N][2];
double get(double x, double y) // 竖直位置上从x到y所需的时间
{
if(x > y) return (x - y) / 1.3; // 向下
else return (y - x) / 0.7; // 向上
}
int main()
{
cin >> n;
for(int i = 1; i <= n; i ++) cin >> x[i];
for(int i = 1; i < n; i ++) cin >> a[i] >> b[i + 1];
for(int i = 1; i <= n; i ++) f[i][0] = f[i][1] = INF;//求最小值,全部初始化正无穷
f[1][0] = x[1]; //第一根竹杆只可以从地面上爬过来
for(int i = 2; i <= n; i ++)
{
int d = x[i] - x[i - 1];
//dp
f[i][0] = min(
f[i - 1][0] + d,
f[i - 1][1] + d + get(b[i - 1], 0)
);
f[i][1] = min(
f[i - 1][0] + get(0, a[i - 1]),
f[i - 1][1] + get(b[i - 1], a[i - 1])
);
}
printf("%.2lf\n", min(f[n][0], f[n][1] + b[n] / 1.3));
return 0;
}
AcWing 5400. 蜗牛 状态dp
最新推荐文章于 2024-10-03 13:36:06 发布
这篇文章介绍了一个使用C++编写的动态规划算法来解决竹竿爬升问题,通过计算在不同条件下到达目标所需的最短时间,最终输出最小成本。
摘要由CSDN通过智能技术生成