题意:

       给一个终点,然后给你一个卡车距离终点的距离,还有其他个加油站距离终点的距离,然后每走一个单位距离要花费一个单位油,卡车的邮箱是无限大的,而每个加油站的油量是有限的,整个路径是一个线性的,然后求到达终点的最少加油次数。

思路: 

      想了将近20分钟才想出来,哎! 我的方法是贪心,大体思路是这样,先给加油站排序,然后从离自己最紧的开始枚举,如果当前能到达该加油站,那么把改加油站存起来,如果到达不了,那么就从之前存的里面取一个油量最大的加油,增加了当前能到的最大程度(这个值期初是卡车的原始油量),如果还是到不了,再继续取,就这样一直进行到到达终点,或者是改从库存里面取最大的加油的时候发现库存没有加油站了为止,对于这个库存我是用优先队列模拟的,这个不固定,用什么都行,比如set,一次操作的时间复杂度都是log(n),最后别忘了两种特殊情况,就是不用加油直接可以到达终点,还有就是有可能所有加油站都必须加油(这个是小心忘记一个判断),当然如果写的好的话无形中就躲开了这两种易错点,比如虚拟终点0
0 啥的,就说这么多吧!下面是我的方法,写的比较挫!而且还很有可能和官方标程思路不一样,我的时间复杂度是O(n*log(n))的。对了!最后还有两点,一个是记得给加油站排个序,还有就是不存在比卡车还远的加油站,一开始想多了。

#include<queue>

#include<stdio.h>

#include<string.h>

#include<algorithm>

#define N 10000 + 100

using namespace std;

typedef struct

{

    int a ,b;

}P;

typedef struct NODE

{

    int x;

    friend bool operator < (NODE a ,NODE b)

    {

        return a.x < b.x;

    }

}NODE;

P p[N];

bool camp(P a ,P b)

{

    return a.a < b.a;

}

int  main ()

{

    int n ,i ,x ,y;

    scanf("%d" ,&n);

    for(i = 1 ;i <= n ;i ++)

    scanf("%d %d" ,&p[i].a ,&p[i].b);

    scanf("%d %d" ,&x ,&y);

    sort(p + 1 ,p + n + 1 ,camp);

    int nowsum = 0 ,mkok = 0 ,nowlen = y;

    if(y >= x) mkok = 1;

    priority_queue<NODE>q;

    NODE xin ,tou;

    while(!mkok && n >= 1)

    {

        if(nowlen >= x - p[n].a)

        {

            xin.x = p[n].b;

            q.push(xin);

            n --;

        }

        else

        {

            if(q.empty()) break;

            tou = q.top();

            q.pop();

            nowlen += tou.x;

            nowsum ++;

            if(nowlen >= x)

            {

                mkok = 1;

                break;

            }

        }

    }

    while(!mkok && !q.empty())

    {

        tou = q.top();

        q.pop();

        nowlen += tou.x;

        nowsum ++;

        if(nowlen >= x)

        {

            mkok = 1;

            break;

        }

    }

    if(!mkok) nowsum = -1;

    printf("%d\n" ,nowsum);

    return 0;

}

POJ2431贪心(最少加油次数)的更多相关文章

  1. LeetCode 871 - 最低加油次数 - [贪心+优先队列]

    汽车从起点出发驶向目的地,该目的地位于出发位置东面 target 英里处. 沿途有加油站,每个 station[i] 代表一个加油站,它位于出发位置东面 station[i][0] 英里处,并且有 s ...

  2. Leetcode(871)-最低加油次数

    汽车从起点出发驶向目的地,该目的地位于出发位置东面 target 英里处. 沿途有加油站,每个 station[i] 代表一个加油站,它位于出发位置东面 station[i][0] 英里处,并且有 s ...

  3. [LeetCode] Minimum Moves to Equal Array Elements II 最少移动次数使数组元素相等之二

    Given a non-empty integer array, find the minimum number of moves required to make all array element ...

  4. 面试题:对一个正整数n,算得到1需要的最少操作次数

    实现一个函数,对一个正整数n,算得到1需要的最少操作次数.操作规则为:如果n为偶数,将其除以2:如果n为奇数,可以加1或减1:一直处理下去.例子:func(7) = 4,可以证明最少需要4次运算n = ...

  5. [Swift]LeetCode871. 最低加油次数 | Minimum Number of Refueling Stops

    A car travels from a starting position to a destination which is target miles east of the starting p ...

  6. 给出两个单词word1和word2,写一个函数计算出将word1 转换为word2的最少操作次数。

    问题: 给出两个单词word1和word2,写一个函数计算出将word1 转换为word2的最少操作次数. 你总共三种操作方法: 1.插入一个字符 2.删除一个字符 3.替换一个字符 格式: 输入行输 ...

  7. x变成y的最少操作次数(层次遍历)

    输入x,y,x为源数字,y为目标值.输出x变成y的最少操作次数. x每次可以执行三种操作:-1 . +1 . x2: 如 x=5,y=8:5-1=4,4x2=8;所以输出结果为2(次操作). 可以发现 ...

  8. nyoj最少乘法次数——快速幂思想

    最少乘法次数 时间限制:1000 ms  |  内存限制:65535 KB 难度:3   描述 给你一个非零整数,让你求这个数的n次方,每次相乘的结果可以在后面使用,求至少需要多少次乘.如24:2*2 ...

  9. 使序列有序的最少交换次数(minimum swaps)

    交换相邻两数 如果只是交换相邻两数,那么最少交换次数为该序列的逆序数. 交换任意两数 数字的总个数减去循环节的个数?? A cycle is a set of elements, each of wh ...

随机推荐

  1. 译文《最常见的10种Java异常问题》

    封面:洛小汐 译者:潘潘 知彼知己,方能百战不殆. 前言 本文总结了有关Java异常的十大常见问题. 目录 检查型异常(checked) vs. 非检查型异常(Unchecked) 异常管理的最佳实践 ...

  2. Hi3559AV100外接UVC/MJPEG相机实时采图设计(四):VDEC_Send_Stream线程分析

    下面随笔将对Hi3559AV100外接UVC/MJPEG相机实现实时采图设计的关键点-VDEC_Send_Stream线程进行分析,一两个星期前我写了有三篇系列随笔,已经实现了项目功能,大家可以参考下 ...

  3. 强制断开ssh连接出现ssh崩溃问题

    出现原因 finalshell意外终止,导致ssh连接意外终止 之后怎么都连不上虚拟机的ssh,一看是虚拟机的ssh已经被意外暂停,可能是跟finalshell的意外终止有关 解决 chmod 600 ...

  4. 解决图片把父元素向下撑大大约3px问题

    现象  bug: 图片在div\li\dt 等  图片把父元素向下撑大大约3px  <style>         img {             width: 30%; //这里由于 ...

  5. vue Element-ui el-menu 左侧导航条

    <template> <!--实现左侧导航条动态渲染(三级)--> <el-menu class="el-menu-vertical-demo" @o ...

  6. Codeforces Round #548 C. Edgy Trees

    题面: 传送门 题目描述: 给出有n个节点的树,整数k.题目要求找长度为k,符合规则(good序列)的"点序列"(由节点构成的序列)个数有多少?规则如下: 1.走一条出发点为a1, ...

  7. Codeforces 784B Santa Claus and Keyboard Check

    题面: 传送门 B. Santa Claus and Keyboard Check Input file: standard input Output file: standard output Time ...

  8. Tornado 简明教程

    1.TornadoTornado:python编写的web服务器兼web应用框架1.1.Tornado的优势轻量级web框架异步非阻塞IO处理方式出色的抗负载能力优异的处理性能,不依赖多进程/多线程, ...

  9. 【Azure 云服务】在Cloud Service的代码中如何修改IIS Application Pool的配置呢? 比如IdleTimeout, startMode, Recycling.PeriodicRestart.Time等

    什么是 PaaS?Platform as a Service 平台即服务 (PaaS) 是云中的完整开发和部署环境,你可以使用其中资源交付内容,从基于云的简单应用到启用云的复杂企业应用程序皆可.你以即 ...

  10. python函数之闭包函数与无参装饰器

    一.global与nonlocal #global x = 1 def f1(): global x # 声明此处是全部变量x x = 2 print(x) f1() # 调用f1后,修改了全局变量x ...