题解:P2836 加油问题
OIer_ACMer · · 题解
第一次十二分钟切一道蓝题。
题目解析:
本题由于
我们可以借用一点闫氏动态规划分析法的思想,找出最后一个不同点:是否在一个站加油。我们在深度优先搜索中设三个参数:
什么,你问我为什么在不加油时不用对
最后,注意两个点,一个是要判断当前的点是否到达
第二个,如果我们判断此时的
代码如下:
#include <bits/stdc++.h>
using namespace std;
double dis, rl, w, mon;
int n;
struct node
{
double jl, jg;
} zhan[1000009];
double ans = INT_MAX;
void dfs(int wz, double mon, double oil)
{
if (oil < (zhan[wz].jl - zhan[wz - 1].jl) / w)
{
return;
}
else if (wz == n + 1)
{
ans = min(ans, mon);
return;
}
oil -= (zhan[wz].jl - zhan[wz - 1].jl) / w;
if (oil <= rl / 2)
{
dfs(wz + 1, mon + 2.00 + (1.0 * (zhan[wz].jg * (rl - oil)) / 100.0), rl); // 加油
}
dfs(wz + 1, mon, oil); // 不加油
}
int main()
{
cin >> dis >> rl >> w >> mon;
cin >> n;
zhan[n + 1].jl = dis;
zhan[0].jg = 0;
for (int i = 1; i <= n; i++)
{
cin >> zhan[i].jl >> zhan[i].jg;
}
dfs(1, mon, rl);
cout << fixed << setprecision(2) << ans;
return 0;
}