• 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);  
    }  
  • 相关阅读:
    mock 数据模拟
    利用css绘制三角形,半圆等形状
    页面底部固定
    Form Data格式传参
    element 页面显示效果及需要注意的点
    vue 组件加载顺序
    vue-router 导航钩子
    vue 总结
    前端开发的碎碎念
    值匹配的方式
  • 原文地址:https://www.cnblogs.com/xuanyiming/p/7497580.html
Copyright © 2020-2023  润新知