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 探险

51nod1563

51Nod1039 N^3 Mod P 数论 原根 BSGS

51nod1174(RMQ)

51nod1105(二分)

51nod 1179:最大的最大公约数