题意:

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

思路: 

      想了将近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. .NET CORE 3.1 MVC Log4net

    1 引用包:Microsoft.Extensions.Logging.Log4Net.AspNetCore   2 ILoggerFactory loggerFactory 注册 public voi ...

  2. WPF 基础 - x 名称空间详解

    名称 种类(默认Attribute) 备注 x:Array 标记拓展 可作为 ListBox.ItemsSource 的值 x:Class 指定与 .cs 中哪个类合并,所指示的类型在声明时使用 pa ...

  3. 自然语言处理(NLP)知识结构总结

    自然语言处理知识太庞大了,网上也都是一些零零散散的知识,比如单独讲某些模型,也没有来龙去脉,学习起来较为困难,于是我自己总结了一份知识体系结构,不足之处,欢迎指正.内容来源主要参考黄志洪老师的自然语言 ...

  4. 找单词 HDU - 2082(普通母函数)

    题目链接:https://vjudge.net/problem/HDU-2082 题意:中文题. 思路:构造普通母函数求解. 母函数: 1 #include<time.h> 2 #incl ...

  5. SSH&SSM

    SSH和SSM的区别 SSH是Spring+Struts+Hibernate的缩写,是一种Web应用程序开源框架.框架系统分为四层:表选层.业务逻辑层.数据持久层和模块层.SSM是Spring+Spr ...

  6. mybatis-plus的Could not set property 'updateDate' of 'class com.example.pojo.User' with value 'Fri Jul 24 10:29:39 CST 2020' Cause: java.lang.IllegalArgumentException: argument type mismatch解决方案

    按照官网在写mybatis-plus的自动填充功能一直报错,发现官网的解说不全,数据库是datetime类型,java程序又是date,类型不匹配 org.mybatis.spring.MyBatis ...

  7. 冒泡排序(BubbleSort)

    介绍: 冒泡排序是一种最基础的交换排序(两两比较待排序的关键字,交换不满足次序要求的那对数,直到整个表都满足次序要求为止),工作方式如同碳酸饮料中的二氧化碳气泡最终会上浮到顶端一样,故名"冒 ...

  8. shell的配置文件

    1. bash shell 的配置文件 bash shell的配置文件很多,可以分成下面类别 1.1 按生效范围划分两类 全局配置:针对所有用户皆有效 /etc/profile /etc/profil ...

  9. 让你的程序炫起来!少有人知道但超酷的 Python 进度条开源库

    本文适合有 Python 基础的朋友 本文作者:HelloGitHub-Anthony HelloGitHub 推出的<讲解开源项目>系列,本期介绍让你快速拥有完美进度条的 Python ...

  10. CVE-2010-3333-office RTF栈溢出漏洞分析

    0x00 前言 此漏洞是根据泉哥的<漏洞战争>来学习分析的,网上已有大量分析文章在此只是做一个独立的分析记录. 0x01 复现环境 操作系统-->windows7 x64 软件版本- ...