zoukankan      html  css  js  c++  java
  • POJ2431_Expedition_KEY

    题目传送门

    由题目可得,在一条路上有N个加油站,在距离终点a[i](细节)的位置上,你需要通过长度为L的路,油箱的容量是无限的,但是初始只有P点油,经过每个加油站时可以选择加b[i]的油,问最少加油几次可以到达终点。

    可以看出经过每一个加油站时可以有两个选择:加油或不加油,但过去了就不能回来

    假如我们就要没油了,我们是不是这样想:我当时应该在XX加油站加油才对。

    所以,我们假设我们可以时空穿梭,回到经过XX加油站的时候,立即加油。

    开一个堆记录经过的、未加油的加油站。

    在即将没油时从堆里拿出油多的加油站加油,直到又有油可以到达下一个加油站。

    这里有一个细节,要再设置一个在终点的、油量为0的加油站。

    code:

    #include <cstdio>
    #include <cctype>
    #include <algorithm>
    #include <queue>
    using namespace std;
    inline char getch(){
        static char fl[100000],*A=fl,*B=fl;
        return A==B&&(B=(A=fl)+fread(fl,1,100000,stdin),A==B)?EOF:*A++;
    }
    inline int read(){
        char c;
        while(!isdigit(c=getch()));int x=c-'0';
        while(isdigit(c=getch()))x=x*10+c-'0';
        return x;
    }
    int L,P,i,now,ans;
    struct node{
        int x,y;
    }a[10001];
    inline int cmp(node x,node y){return x.x<y.x;}
    int main(){
        int N;
        while(~scanf("%d",&N)){
            for(i=1;i<=N;i++)a[i].x=read(),a[i].y=read();
                    L=read(),P=read();
                    for(i=1;i<=N;i++)a[i].x=L-a[i].x;
            a[++N].x=L;priority_queue<int>w;
            sort(a+1,a+N+1,cmp);
            for(i=1;i<=N;i++){
                int cost=a[i].x-now;
                    while(P<cost){
                        if(w.empty()){puts("-1");return 0;}
                        P+=w.top(),w.pop(),ans++;
                    }
                w.push(a[i].y);
                now=a[i].x,P-=cost;
            }
        printf("%d
    ",ans);    
        }
    }    
  • 相关阅读:
    linux seqlock 锁
    linux 位操作
    linux 原子变量
    linux 读者/写者自旋锁
    linux自旋锁函数
    linux 自旋锁 API 简介
    linux Completions 机制
    linux 读者/写者旗标
    linux 在 scull 中使用旗标
    Linux 旗标实现
  • 原文地址:https://www.cnblogs.com/Cptraser/p/7632819.html
Copyright © 2011-2022 走看看