51nod汽油补给
這題沒什么好講的啦
自己YY一下就好了
貪心的選擇當(dāng)前能到達(dá)的地點中費用最低的
然后就在那里買油啦
分類討論一下只在那里買油夠不夠多走一個地點
夠的話就先走到那里然后重復(fù)操作(此時仍可在最優(yōu)點那買油,因為還沒裝滿嘛,還可能在這繼續(xù)買)
不夠的話就在那里買滿,然后到這個點的下一個點,重復(fù)
PS:細(xì)節(jié)有點多,自己慢慢處理啦
上代碼:
#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; }轉(zhuǎn)載于:https://www.cnblogs.com/Brian551/p/7353026.html
總結(jié)
- 上一篇: oracle11g中SQL优化(SQL
- 下一篇: Spring+SpringMVC+MyB