5308. 公路

发布时间:2024年01月05日

题意

有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总直播讲解完这题,再对该博客进行一些补充和修改

向上取整是防止跑到一半没有油了,宁可多出一点也不可以半路熄火

文章来源:https://blog.csdn.net/L3102250566/article/details/135409169
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。