51nod汽油補給

2021-08-02 21:13:58 字數 1465 閱讀 8098

汽油補給

李陶冶(命題人)

基準時間限制:1 秒 空間限制:131072 kb 分值: 160

有(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。

input

第1行:2個數n, t中間用空格分隔,n + 1為城市的數量,t為油箱的容量(2 <= n <= 100000, 1 <= t <= 10^9)。

output

輸出走完整個旅程的最小花費,如果無法從起點到達終點輸出-1。

input示例

3 15

10 2

9 18 3

output示例

41
c++的執行時限為:1000 ms ,空間限制為:131072 kb 

示例及語言說明請按這裡

這題沒什麼好講的啦

自己yy一下就好了

貪心的選擇當前能到達的地點中費用最低的

然後就在那裡買油啦

分類討論一下只在那裡買油夠不夠多走乙個地點

夠的話就先走到那裡然後重複操作(此時仍可在最優點那買油,因為還沒裝滿嘛,還可能在這繼續買)

不夠的話就在那裡買滿,然後到這個點的下乙個點,重複

ps:細節有點多,自己慢慢處理啦

上**:

#include#include#includeconst int n=100005;

long long int d[n],p[n];

long long su[n];

struct node

};std::priority_queueq;

int main()

),j++;

node u=q.top();q.pop();

if(su[j]-su[u.j]<=t) r=v-su[j-1]+su[now],sum+=p[u.j]*(d[j]-r),v=v-su[u.j]+su[now]+(d[j]-r),now=u.j;

else v-=su[u.j]-su[now],sum+=p[u.j]*(t-v),v+=t-v,v-=d[u.j+1],now=u.j+1;

while(!q.empty()) q.pop();

} printf("%lld\n",sum);

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...