洛谷 P9749 [CSP-J 2023] 公路 题解
这题是一道贪心题。
当车行驶到第 \(i\) 个车站时,我们先算出目前的油是否够行驶到第 \(i+1\) 车站,如果够则跳过。否则计算行驶到下一个车站还差多少公里,然后买 \(a_1\sim a_i\) 中最便宜的油(因为现在需要的油可以在之前行驶到那个车站的时候提前买)。由于每个站点只出售整数升的油,买的油的斤数要向上取整。
由于 \(n\le10^5\),\(a_i\le10^5\),\(v_i\le10^5\),结果最大可以是 \(10^5\times10^5\times10^5=10^{15}\),所以要开 long long。
#include<iostream>
#include<cstdio>
using namespace std;
typedef long long ll;
const int N=1e5+100,INF=2e9;
int n,d;
ll len,sum,needlen,needsh,v[N],a[N],mi=INF;
int main()
{
scanf("%d%d",&n,&d);
for(int i=1;i<n;i++)
{
scanf("%lld",&v[i]);
v[i]+=v[i-1];//前缀和求出到当前车站一共要多少公里
}
for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
for(int i=1;i<n;i++)
{
mi=min(mi,a[i]);//求出a[1]~a[i]中最便宜的油
needlen=v[i]-len;//当前的油还差多少公里才能到下一个车站
if(needlen<=0) continue;//当前的油够行驶到下一个车站,跳过
needsh=needlen/d;//求出需要多少斤的油
if(needlen%d!=0) needsh++;//向上取整
len+=needsh*d;
sum+=needsh*mi;
}
printf("%lld",sum);
return 0;
}

浙公网安备 33010602011771号