51nod1288汽油补给
Posted 宣毅鸣
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了51nod1288汽油补给相关的知识,希望对你有一定的参考价值。
考虑当前这个汽油站加的情况。
如果在t以内的范围有一个加油站比当前加油站便宜,那么就只需要加油加到足够开到最近的比自己便宜的加油站。
否则加满。
但是寻找超时
我们可以先加满,找到一个便宜的加油站之后,把自己多出来的油“倒回去”。
这样就可以了。
代码:
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int N=200005; struct no { ll price,num; }; bool cmp(no x,no y) { return x.price<y.price; } ll n,t,dis[N],pri[N]; int main() { scanf("%lld%lld",&n,&t); for (int i=1;i<=n;i++)scanf("%d%d",&dis[i],&pri[i-1]); vector<no>qu; int flag=1; ll res=0; for (int i=1;i<=n;i++) if (dis[i]>t) { puts("-1"); return 0; } for (int i=0;i<=n;i++) { if (!i) { no n1={pri[0],t}; qu.push_back(n1); } else { sort(qu.begin(),qu.end(),cmp); ll di=0,rmin=0; while (1) { if (di+qu[0].num>=dis[i]) { rmin=rmin+(dis[i]-di)*(qu[0].price); if (di+qu[0].num>=dis[i]) qu[0].num=qu[0].num-(dis[i]-di); if (!qu[0].num)qu.erase(qu.begin()); break; } else { di+=qu[0].num; rmin+=qu[0].num*qu[0].price; qu.erase(qu.begin()); } } res+=rmin; ll sum=0; for (int k=0;k<qu.size();k++) { if (pri[i]>qu[k].price)sum+=qu[k].num; else { no n1; n1.num=t-sum; n1.price=pri[i]; qu.erase(qu.begin()+k,qu.end()); qu.push_back(n1); sum=t; break; } } if (sum<t) { no n1; n1.price=pri[i]; n1.num=t-sum; qu.push_back(n1); } } } printf("%lld",res); }
以上是关于51nod1288汽油补给的主要内容,如果未能解决你的问题,请参考以下文章
BZOJ1747: [Usaco2005 open]Expedition 探险