本文最后更新于 2024年7月30日 晚上
此题为CSP-J 2023 第二题公路。题目传送门
分析
阅读题目后,考虑做法易得贪心。路上一共有
个加油站,选择加油站应当选择下一个比当前便宜的加油站,如果没有比当前便宜的了那就下一站选择终点。我们需要在每个加油站加油使得恰好能够跑到下一个目标站点以取得最便宜的价钱,所以我们需要计算出下一个目标站点到当前站点的距离,于是采用前缀和的方式记录
个加油站中第 ~ 的距离
,那么便可以求出任意两个加油站的距离。我们还需要一个数组用来求第 个加油站后下一个要去的站点 为多少,可以这样表示
next_min[i] = j
。最后计算邮费的时候需要注意一个小坑,题目中提到了油只能加整升的油,也就是我们跑到目标站点的时候会有剩余的油,所以我们在加油的时候需要把剩余的部分一起考虑进去即可。最后注意要用long
long不让50分。
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| #include<bits/stdc++.h> #define ll long long using namespace std; const int N = 1e5+5; ll n,d,v[N],a[N],next_min[N],next_xb,next_jq,oil,sy_dis,ans;
int main() { cin>>n>>d; for(int i=2;i<=n;i++) cin>>v[i]; for(int i=1;i<=n;i++) cin>>a[i]; for(int i=2;i<=n;i++) v[i]+=v[i-1]; next_xb=1,next_jq=a[1]; for(int i=2;i<=n;i++) if(a[i]<next_jq) next_min[next_xb]=i,next_xb=i,next_jq=a[i]; next_min[next_xb]=n; int i=1; while(i<n) { oil=ceil((v[next_min[i]]-v[i]-sy_dis)*1.0/d); ans+=oil*a[i]; sy_dis+=oil*d-(v[next_min[i]]-v[i]); i=next_min[i]; } cout<<ans<<endl; return 0; }
|
蒟蒻在考场把程序写成了 ,痛失45分QWQ