日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

51nod汽油补给

發布時間:2025/7/14 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 51nod汽油补给 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.


汽油補給? ? 李陶冶?(命題人) 基準時間限制:1?秒 空間限制:131072?KB 分值:?160 有(N+1)個城市,0是起點N是終點,開車從0 -> 1 - > 2...... -> N,車每走1個單位距離消耗1個單位的汽油,油箱的容量是T。給出每個城市到下一個城市的距離D,以及當地的油價P,求走完整個旅途最少的花費。如果無法從起點到達終點輸出-1。 例如D = {10, 9, 8}, P = {2, 1, 3},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)。 第2至N?+?1行:每行2個數D[i],?P[i],中間用空格分隔,分別表示到下一個城市的距離和當地的油價(1?<=?D[i],?P[i]?<=?1000000)。 Output 輸出走完整個旅程的最小花費,如果無法從起點到達終點輸出-1。 Input示例 3?15 10?2 9?1 8?3 Output示例 41 C++的運行時限為:1000?ms ,空間限制為:131072?KB?示例及語言說明請按這里


這題沒什么好講的啦

自己YY一下就好了

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

然后就在那里買油啦

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

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

不夠的話就在那里買滿,然后到這個點的下一個點,重復

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

上代碼:

#include<cstdio> #include<cstring> #include<queue> const int N=100005; long long int d[N],p[N]; long long su[N]; struct node {long long int j,x;bool operator < (const node &y)const {return x>y.x;} }; std::priority_queue<node> q; int main() {int n,t;scanf("%d %d",&n,&t);for(int i=1;i<=n;i++) scanf("%lld %lld",&d[i],&p[i-1]),su[i]=su[i-1]+d[i];int now=0;long long int sum=0;int v=0; int r;while(now<n){int j=now;while(j<=n&&v>=su[j]-su[now]) q.push((node){j,p[j]}),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; }



轉載于:https://www.cnblogs.com/Brian551/p/7353026.html

總結

以上是生活随笔為你收集整理的51nod汽油补给的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。