POJ 2431 Expedition (优先队列 + 贪心)

来源:互联网 发布:网络对传播的作用 编辑:程序博客网 时间:2024/05/01 18:08

细节上wa了n发。。。优先队列。把经过的加油站的油量先存着,需要的时候取最多的那个。用优先队列即可以实现。注意给的距离是到终点的距离。。。以为我初始代码按到 起点距离写的,所以就拿l减了一下。注意排序。。。毕竟没说是不是按顺序的。。。还有queue的清零POJ - 2431

#include<cstdio>#include<iostream>#include<queue>#include<algorithm>using namespace std;#define maxn 1000001#define SC(a,b) scanf("%lld%lld",&a,&b)typedef long long LL; struct My{    LL dis,num;}arr[maxn];bool cmp(My a, My b){    return a.dis<b.dis;}//LL a[maxn],b[maxn];int main(){    LL n;LL l,p;    while(~scanf("%lld",&n))    {        for(int i=0;i<n;i++)            SC(arr[i].dis,arr[i].num);        SC(l,p);bool flag=0;        for(int i=0;i<n;i++)        {            arr[i].dis=l-arr[i].dis;    //      cout<<a[i]<<endl;        }        priority_queue<LL> Q;        while(!Q.empty()) Q.pop();        LL ans=0;        sort(arr,arr+n,cmp);        for(int j=0;j<n;j++)        {            if(p<arr[j].dis&&Q.empty())            {                flag=1;                break;            }            else if(p<arr[j].dis&&!Q.empty())            {                while(p<arr[j].dis&&!Q.empty())                {                    p+=Q.top();                    ans++;                    Q.pop();                }                if(p<arr[j].dis)                {                    flag=1;                    break;                }            }            Q.push(arr[j].num);            if(arr[j].dis>=l) break;        }        if(p<l)        {            while(!Q.empty()&&p<l)            {                p+=Q.top();                Q.pop();                ans++;            }            if(p<l) flag=1;        }        printf("%lld\n",flag?-1:ans);     }}