POJ2431贪心(最少加油次数)
题意:
给一个终点,然后给你一个卡车距离终点的距离,还有其他个加油站距离终点的距离,然后每走一个单位距离要花费一个单位油,卡车的邮箱是无限大的,而每个加油站的油量是有限的,整个路径是一个线性的,然后求到达终点的最少加油次数。
思路:
想了将近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贪心(最少加油次数)的更多相关文章
- LeetCode 871 - 最低加油次数 - [贪心+优先队列]
汽车从起点出发驶向目的地,该目的地位于出发位置东面 target 英里处. 沿途有加油站,每个 station[i] 代表一个加油站,它位于出发位置东面 station[i][0] 英里处,并且有 s ...
- Leetcode(871)-最低加油次数
汽车从起点出发驶向目的地,该目的地位于出发位置东面 target 英里处. 沿途有加油站,每个 station[i] 代表一个加油站,它位于出发位置东面 station[i][0] 英里处,并且有 s ...
- [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 ...
- 面试题:对一个正整数n,算得到1需要的最少操作次数
实现一个函数,对一个正整数n,算得到1需要的最少操作次数.操作规则为:如果n为偶数,将其除以2:如果n为奇数,可以加1或减1:一直处理下去.例子:func(7) = 4,可以证明最少需要4次运算n = ...
- [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 ...
- 给出两个单词word1和word2,写一个函数计算出将word1 转换为word2的最少操作次数。
问题: 给出两个单词word1和word2,写一个函数计算出将word1 转换为word2的最少操作次数. 你总共三种操作方法: 1.插入一个字符 2.删除一个字符 3.替换一个字符 格式: 输入行输 ...
- x变成y的最少操作次数(层次遍历)
输入x,y,x为源数字,y为目标值.输出x变成y的最少操作次数. x每次可以执行三种操作:-1 . +1 . x2: 如 x=5,y=8:5-1=4,4x2=8;所以输出结果为2(次操作). 可以发现 ...
- nyoj最少乘法次数——快速幂思想
最少乘法次数 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描述 给你一个非零整数,让你求这个数的n次方,每次相乘的结果可以在后面使用,求至少需要多少次乘.如24:2*2 ...
- 使序列有序的最少交换次数(minimum swaps)
交换相邻两数 如果只是交换相邻两数,那么最少交换次数为该序列的逆序数. 交换任意两数 数字的总个数减去循环节的个数?? A cycle is a set of elements, each of wh ...
随机推荐
- 十一. SpringCloud Alibaba
1. SpringCloud Alibaba简介 1.1 为什么会出现SpringCloud Alibaba Spring Cloud Netflix项目进入到维护模式 什么是维护模式?=> 将 ...
- SpringBoot启动流程原理解析(二)
在上一章我们分析了SpingBoot启动流程中实例化SpingApplication的过程. return new SpringApplication(primarySources).run(args ...
- go中sync.Cond源码解读
sync.Cond 前言 什么是sync.Cond 看下源码 Wait Signal Broadcast 总结 sync.Cond 前言 本次的代码是基于go version go1.13.15 da ...
- Redis持久化操作RDB和AOF 对比于HDFS的SecondaryNode
写在前面的话 最近学习比较多流行的大数据框架和完成两个大数据项目后,又突然学起了Redis.之所以之前的框架不学习记录呢,是因为之前的学习都是为了完成参加服创比赛的项目所以时间较紧,现在基本架构和编码 ...
- slickgrid ( nsunleo-slickgrid ) 3 修正区域选择不能跨冻结列的问题
slickgrid ( nsunleo-slickgrid ) 3 修正区域选择不能跨冻结列的问题 上次解决区域选择不能跨冻结列问题的时候,剩了个尾巴,从右往左选择的时候,会出现选择不正常的情况,后 ...
- springboot 配置文件application
application.properties # ----------------------------------------# 核心属性# --------------------------- ...
- C语言之漫谈指针(上)
C语言之漫谈指针(上) 在C语言学习的途中,我们永远有一个绕不了的坑,那就是--指针. 在这篇文章中我们就谈一谈指针的一些基础知识. 纲要: 零.谈指针之前的小知识 一.指针与指针变量 二.指针变量的 ...
- C#上机实验(三)
源码如下: using System; using System.Collections.Generic; using System.Linq; using System.Text; namespac ...
- python基础之基本数据类型与基本运算符
一.基本数据类型 1.整数类型 作用:描述年龄.等级,电话号码等数据类型 age = 18 phone_number = 13572839204 2.浮点型 作用:描述薪资.身高等带小数的类型 hei ...
- tasker支持的shell 命令大全
参考 http://www.notenoughtech.com/tasker/tasker-run-shell-commands/ 罗列所有系统配置项 settings list system s ...