POJ2431(优先队列+贪心)

#include <iostream>  
#include <stdio.h>  
#include <string.h>   
#include <stack>  
#include <queue>   
#include <map>  
#include <set>  
#include <vector>  
#include <math.h>  
#include <bitset>  
#include <algorithm>  
#include <climits>   
using namespace std;  
#define lson 2*i  
#define rson 2*i+1 
#define Pair pair<int, int> 
#define ULL unsigned long long
#define LS l,mid,lson  
#define RS mid+1,r,rson  
#define up(i,x,y) for(int i=x;i<y;i++)  
#define down(i,x,y) for(int i=x;i>=y;i--)  
#define MEM(a,x) memset(a,x,sizeof(a))  
#define W(a) while(a)  
#define gcd(a,b) __gcd(a,b)  
#define LL long long  
#define N 1000005  
#define MOD 1000000007  
#define INF 0x3f3f3f3f  
#define EXP 1e-8  
#define lowbit(x) (x&-x)  
#define _  ios_base::sync_with_stdio(0),cin.tie(0)
//freopen("1.txt", "r", stdin);
const int m=1e6;
Pair itv[m+5];
int a[m+5],b[m+5],c[m+5];
int n,l,p;
int main(){
    scanf("%d",&n);
    
    for(int i=0;i<n;i++){
        scanf("%d%d",&c[i],&b[i]);
        a[i]=l-c[i];//c[i]代表距离终点的距离,把从c[i]转成a[i],代表距离起点的距离 
    }
    scanf("%d%d",&l,&p);
    a[n]=l;b[n]=0;
    for(int i=0;i<=n;i++){
        a[i]=l-c[i];
        itv[i].first=a[i];
        itv[i].second=b[i];    
    }
    sort(itv,itv+n+1);//进行排序,看看先经过哪个加油站 
    
    priority_queue<int>que;//优先队列,当油用完,选取最大的油量进行加油 
    int ans=0,pos=0,tank=p;//ans加油次数,pos当前位置,tank当前油量 
    for(int i=0;i<=n;i++){
        int d=itv[i].first-pos;
        while(tank-d<0){
            if(que.empty()){
                puts("-1");
                return 0;
            }
            tank+=que.top();
            que.pop();
            ans++;
        }
        tank-=d;
        pos=itv[i].first;
        que.push(itv[i].second);
    }
    printf("%d\n",ans);

}

猜你喜欢

转载自blog.csdn.net/a2392008643/article/details/81489726