《挑战程序设计竞赛》将优先队列的那里,讲了一个和这个差不多的例题。
我是把所有路合成了一条直的线路,枚举路中间每个加油站,看车是否能到达这里,然后模拟一发就过了。
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1e4+10;
typedef long long LL;
LL A[MAXN];
int main()
{
ios::sync_with_stdio(false);
LL a,b,f,k;
cin >> a >> b >> f >> k;
for(LL i = 0; i < k; ++i)
{
if(i%2 == 0)
A[i] = f+(i*a);
else
A[i] = (i+1)*a-f;
}
A[k] = k*a;
LL tank = b;
LL ans = 0;
LL pos = 0;
LL sz = 0;
for(LL i = 0; i <= k; ++i)
{
LL d = A[i]-pos;
while(tank - d < 0)
{
if(sz == 0)
{
puts("-1");
return 0;
}
tank = b;
sz = 0;
ans++;
}
tank -= d;
pos = A[i];
sz = 1;
}
cout << ans << endl;
return 0;
}