有n 个站点,站点可以加油,站点之间的油的价格不一定相等,站点的编号从1到n,站点之间的距离用v表示,站点的油价用a表示,求从1站点到n站点所需要的最小的油价是多少
对于所有测试数据保证:1≤n≤105
,1≤d≤105
,1≤vi≤105
,1≤ai≤105
依次输入站点数目n,每一升油可以跑的距离,站点之间的距离,站点的油的价格
5 4
10 10 10 10
9 8 9 6 5
79
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
long long v[N],a[N],o[N];
int main()
{
int n,d;
cin>>n>>d;
for(int i=2;i<=n;i++)
{
cin>>v[i];
v[i]+=v[i-1];
o[i]=ceil((double)v[i]/d);
}
for(int i=1;i<=n;i++) cin>>a[i];
long long p=a[1];
long long ans=0;
for(int i=1;i<=n;i++)
{
ans+=p*(o[i]-o[i-1]);
p=min(p,a[i]);
}
cout<<ans<<endl;
return 0;
}
前缀和+维护最小值
o数组表示的是油的升数,p表示的是最小的油价,ans表示总的花费
贪心的思想,每一次都是使用当前最小的油价
好像代码很短,非常简单,以上,准备等y总直播讲解完这题,再对该博客进行一些补充和修改
向上取整是防止跑到一半没有油了,宁可多出一点也不可以半路熄火