南沙C++信奧賽陳老師解一本通題 2099:【23CSPJ普及組】公路(road)

南沙区信奥赛陈老师發表於2024-10-03

2099:【23CSPJ普及組】公路(road)


時間限制: 1000 ms 記憶體限制: 524288 KB
提交數:3793 透過數: 1575

【題目描述】

小苞準備開著車沿著公路自駕。

公路上一共有 nn 個站點,編號為從 11 到nn。其中站點 ii 與站點i+1i+1 的距離為vivi 公里。

公路上每個站點都可以加油,編號為ii 的站點一升油的價格為aiai 元,且每個站點只出售整數升的油。

小苞想從站點 11 開車到站點 nn,一開始小苞在站點 11 且車的油箱是空的。已知車的油箱足夠大,可以裝下任意多的油,且每升油可以讓車前進dd 公里。問小苞從站點 11 開到站點 nn,至少要花多少錢加油?

【輸入】

輸入的第一行包含兩個正整數 nn 和dd,分別表示公路上站點的數量和車每升油可以前進的距離。

輸入的第二行包含n−1n−1 個正整數v1v1,v2v2…vn−1vn−1 ,分別表示站點間的距離。

輸入的第三行包含 nn 個正整數 a1a1,a2a2…anan ,分別表示在不同站點加油的價格。

【輸出】

輸出一行,僅包含一個正整數,表示從站點 11 開到站點 nn,小苞至少要花多少錢加油。

【輸入樣例】

5 4
10 10 10 10
9 8 9 6 5

【輸出樣例】

79

【提示】

【樣例 1 解釋】

最優方案下:小苞在站點 11 買了 33 升油,在站點22 購買了 55 升油,在站點 44 購買了 22 升油。

【資料範圍】

對於所有測試資料保證:1≤n≤1051≤n≤105 ,1≤d≤1051≤d≤105 ,1≤vi≤1051≤vi≤105 ,1≤ai≤1051≤ai≤105 。

測試點 n≤ 特殊性質
1∼5 8
6∼10 103
11∼13 105 A
14∼16 105 B
17∼20 105

特殊性質 A:站點 11 的油價最低。

特殊性質 B:對於所有1≤i<n1≤i<n,vivi為 dd 的倍數。

#include <bits/stdc++.h>
using namespace std;
long long  v[100001], a[100001]; //v為站點距離 a為不同站點的加油價格 
int main()
{
	long long n,d;
	double oil=0,leave=0;//leave 表示目前還剩多少升油 
	long long money=0;
	cin>>n>>d;
	for(int i=1;i<=n-1;i++)
		cin>>v[i];
	for(int i=1;i<=n;i++)
		cin>>a[i];
	int i=1;
	while(i<=n)		//站點  
	{
		int j=i+1;
		for(;j<=n-1;j++) //貪心演算法,加油加到到比目前站點小的價格 
			if(a[i]>a[j])
				break;
		double dis=0;
		for(int k=i+1;k<=j;k++)	 	//加油的距離即為i站點到j點的距離
			dis+=v[k-1];			//注意距離即為前站點i-1的距離		
		oil=dis/d-leave;		    
		double buy=ceil(oil);
		leave=buy-oil;
		money+=buy*a[i];
		i=i!=j?j:i++;		//不能用for,否則i=j後,i會繼續加1 
	}
	cout<<money;		
	return 0;
}
南沙C++信奧賽陳老師解一本通題 2099:【23CSPJ普及組】公路(road)

相關文章