洛谷 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;
}
posted @ 2024-07-23 19:39  MinimumSpanningTree  阅读(107)  评论(0)    收藏  举报