51nod 1288 汽油補給 貪心 單調棧

2021-09-26 05:28:53 字數 1226 閱讀 9312

1.0 秒

131,072.0 kb

80 分

5級題有(n+1)個城市,0是起點n是終點,開車從0 -> 1 - > 2...... -> n,車每走1個單位距離消耗1個單位的汽油,油箱的容量是t。給出每個城市到下乙個城市的距離d,以及當地的油價p,求走完整個旅途最少的花費。如果無法從起點到達終點輸出-1。

例如d = , p = ,t = 15,最小花費為41,在0加上10個單位的汽油,在1加滿15個單位的汽油,在2加2個單位的汽油,走到終點時恰好用完所有汽油,花費為10 * 2 + 15 * 1 + 2 * 3 = 41。

收起

第1行:2個數n, t中間用空格分隔,n + 1為城市的數量,t為油箱的容量(2 <= n <= 100000, 1 <= t <= 10^9)。輸出走完整個旅程的最小花費,如果無法從起點到達終點輸出-1。
3 15

10 2

9 18 3

41
分析:(快打比賽了,官方題解)

是乙個典型的貪心演算法,實際上可以列舉當前的城市,然後去計算當前的城市的油價一直到後面哪個城市都是最小的,設這個數為y,當前城市為x,那麼從x到y+1中間的道路消耗的油都應該盡量在x加。顯然,對於每個城市的y是可以用o(n)的時間用單調棧處理出來的,那麼剩下列舉也是o(n)了。

乙個比較好寫的思路大概是,一直保持油箱是滿的,同時油箱看作分了很多塊兒,每塊的油**是不一樣的。行駛過程中,先消耗便宜的油,每到乙個加油站,可以把油箱中比當前油價貴的油換掉,換成當前的**。這樣也是利用乙個單調棧,時間複雜度o(n)。

#includeusing namespace std;

typedef long long ll;

const int n=500005;

ll n,t;

ll d[n],p[n],sum[n];

int r[n];

stacks;

int main()

for(int i=n;i>=1;i--)

ll now=0;

ll ans=0;

for(int i=1;i<=n;i++)

now+=cha;

now-=d[i];

ans+=p[i]*cha;

//cout<}

printf("%lld\n",ans);

return 0;

}

51nod1288 汽油補給

這不是就noip旅行家的預算嗎。只不過這個每公里消耗一公升油,感覺更簡單了些。貪心,每次找乙個點後面第一油價比它低的點,想辦法到那裡讓油全部用完。找它後面第乙個比它 低的點可以用單調棧處理。include include include using namespace std typedef uns...

51Nod 1288 汽油補給

1288 汽油補給 codility 基準時間限制 1 秒 空間限制 131072 kb 分值 160 難度 6級演算法題 有 n 1 個城市,0是起點n是終點,開車從0 1 2.n,車每走1個單位距離消耗1個單位的汽油,油箱的容量是t。給出每個城市到下乙個城市的距離d,以及當地的油價p,求走完整個...

51nod 1288 汽油補給

有 n 1 個城市,0是起點n是終點,開車從0 1 2.n,車每走1個單位距離消耗1個單位的汽油,油箱的容量是t。給出每個城市到下乙個城市的距離d,以及當地的油價p,求走完整個旅途最少的花費。如果無法從起點到達終點輸出 1。例如d p t 15,最小花費為41,在0加上10個單位的汽油,在1加滿15...