poj(2431)(优先队列http://poj.org/problem?id=2431)

来源:互联网 发布:逆波兰式 java 编辑:程序博客网 时间:2024/05/16 03:07

题目:http://poj.org/problem?id=2431


题意:有n个加油站在一条直线上,每个加油站最多可以加多少油,以及加油站的位置到终点的距离,假设汽车邮箱容量无限,以及初始的油量,求能不能到终点及最少的加油次数。


分析:优先队列模拟题意,油足够的话向前走,油不够的时候从走过的路里面选择可以加油最多的地方加油!


代码:

#include <cstdio>#include <iostream>#include <queue>#include <algorithm>using namespace std;const int N = 12000;struct Node{    int lis,pro;};Node a[N];int comp(Node a,Node b){    if(a.lis!=b.lis)        return a.lis<b.lis;}int main(){    priority_queue<int> v;    int n;    while(~scanf("%d",&n))    {        for(int i=1;i<=n;i++)            scanf("%d%d",&a[i].lis,&a[i].pro);        int num,st;        scanf("%d%d",&num,&st);        for(int i=1;i<=n;i++)        {            a[i].lis=num-a[i].lis;        }        sort(a+1,a+n+1,comp);        int ok=1,ans=0;        a[0].lis=0;        a[n+1].lis=num,a[n+1].pro=0;        for(int i=1;i<=n+1;i++)        {            if((a[i].lis-a[i-1].lis)<=st)            {                st-=(a[i].lis-a[i-1].lis);                v.push(a[i].pro);            }            else            {                ans++;                if(v.empty())                {                    ok=0;break;                }                st+=v.top();                v.pop();                i--;            }        }        if(ok==0)            ans=-1;        printf("%d\n",ans);    }    return 0;}/*14 59 5*/


0 0
原创粉丝点击