POJ 2431 Expedition

链接:http://poj.org/problem?id=2431

当燃料用完后,选择经过的所有加油站中能加的油最多的..

所以,在之后需要加油时,就认为在之前经过的加油站加油就可以了..优先队列

#include <iostream>
#include<queue>
#include<algorithm>
using namespace std;
class fuel
{
public:
    int dis;
    int amt;
};
bool cmp(fuel a,fuel b)
{
    return a.dis<b.dis;
}
fuel data[10005];
int l,p,n;

int solve()
{
    data[n].amt=0;
    data[n].dis=l;
    n++;
    priority_queue<int> que;
    int i;
    int d,tank,pos,ans;
    tank=p;
    pos=0;
    ans=0;
    for(i=0;i<n;i++)
        {
            d=data[i].dis-pos;
            while(tank-d<0)
            {
                if(que.empty())
                     return -1;

                tank+=que.top();
                que.pop();
                ans++;

            }
            tank-=d;
            pos=data[i].dis;
            que.push(data[i].amt);

        }
        return ans;


}
int main()
{

    int i;
    while(  cin>>n)
    {

        for(i=0;i<n;i++)
            cin>>data[i].dis>>data[i].amt;
        cin>>l>>p;
        for(i=0;i<n;i++)
            data[i].dis=l-data[i].dis;
        sort(data,data+n,cmp);

        cout<<solve()<<endl;

    }

    return 0;
}


 

原文地址:https://www.cnblogs.com/frankM/p/4399500.html