【51nod 1288】汽油补给
2017-06-24 06:55
155 查看
Description
有(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
#include<cstdio> #include<algorithm> #include<cstring> using namespace std; struct node{long long d,p;}a[100050]; long long ans,n,T,d,p,st=1,ed=1,cnt; long long read() { long long x=0,f=1;char c=getchar(); while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();} while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();} return x*f; } int main() { n=read();T=read(); for(int i=1;i<=n;i++) { d=read();p=read();cnt=0; if(d>T){printf("-1");return 0;} for(int i=st;i<ed;i++) { if(a[i].p<p)cnt+=a[i].d; else ed=i; } if(cnt<T)a[ed].p=p,a[ed].d=T-cnt,ed++; while(st<ed) { if(a[st].d<=d)ans+=a[st].d*a[st].p,d-=a[st].d,st++; else ans+=d*a[st].p,a[st].d-=d,d=0; if(d<=0)break; } } printf("%lld",ans); return 0; }View Code
相关文章推荐
- 51Nod-1288-汽油补给
- 51nod 1288 汽油补给【贪心】【ST表】【单调栈】
- 【51nod 1288 汽油补给 】 贪心 & 思维
- 51nod 1288:汽油补给
- 51Nod-1288-汽油补给
- 51nod 1288 汽油补给[贪心][st表][单调栈]
- 1288 汽油补给(贪心+单调栈)
- 51nod1288 汽油补给
- 汽油补给
- T - 汽油补给
- 【51Nod1288】汽油补给
- [51NOD]1288 序列求和 V4 拉格朗日插值法
- [贪心] 51Nod1288 汽油补给
- 【贪心+ST算法+单调栈】51Nod1288[汽油补给]题解
- 51nod K 汽油补给 大根堆+小根堆....
- 51nod-【1629 B君的圆锥】
- 51nod 1681 公共祖先 | 树状数组
- 51nod 1005 大数加法
- codevs 1288 埃及分数 迭代加深搜索
- 51nod-【1413 权势二进制】