poj 2431 解题记录
来源:互联网 发布:淘宝买药是货到付款吗 编辑:程序博客网 时间:2024/06/11 00:09
题意
给出加油站的位置和油量,以及目前卡车的位置和现有油量,假设卡车的油箱无限大,问最少要加多少次油可以到达终点?
思路
要让我来想这道题估计是想不出来的,我是看了《挑战程序设计》这本书,里面提到了这道题的思路。思路需要做一个转换,本来是先决定加不加油,然后导致结果油够不够用,这种思路要转换成看有够不够用,来决定之前加不加油。。要直接想还有点难度
代码
我写了两个练手,一个是用的stl的优先队列,另外是自己手写了个优先队列,时间复杂度都是O(nlogn)(应该没算错吧。。没把握)
stl的优先队列实现
#include <iostream>#include <algorithm>#include <queue>#include <vector>using namespace std;struct Node{ int dis,fuel; Node(int a,int b):dis(a),fuel(b){};};class comp1{ public: bool operator()(const Node& a,const Node& b) { return a.dis<b.dis; }};class comp2{ public: bool operator()(const Node& a,const Node& b) { return a.fuel<b.fuel; }};vector<Node> v;int main(){ int n; cin>>n; int i; int l,p; v.push_back(Node(0,0)); for(i=0;i<n;i++) { int a,b; cin>>a>>b; v.push_back(Node(a,b)); } cin>>l>>p; sort(v.begin(),v.end(),comp1()); priority_queue<Node,vector<Node>,comp2> pq; i = v.size()-1; int cnt = 0; while(i>=0) { int d = l - v[i].dis; p -= d; l = v[i].dis; if(p<0) { while(!pq.empty()&&p<0) { Node t = pq.top(); pq.pop(); p += t.fuel; cnt++; //cout<<t.dis<<endl; } if(p<0) { cout<<"-1"<<endl; return 0; } } pq.push(v[i]); i--; } cout<<cnt<<endl; return 0;}
结果:Memory: 436K Time: 125MS
自己写的优先队列
#include <iostream>#include <algorithm>#include <queue>#include <vector>using namespace std;struct Node{ int dis,fuel; Node(int a=0,int b=0):dis(a),fuel(b){};};Node heap[10000+10];int sz = 0;void push(Node& x){ int i = sz; heap[sz++] = x; int p = (i-1)/2; if(i==0) return; while(i!=0&&heap[p].fuel<x.fuel) { heap[i] = heap[p]; i = p; p = (i-1)/2; } heap[i] = x;}Node pop(){ int i = 0; Node ret = heap[0]; Node x = heap[--sz]; while(2*i+1<sz) { int a = 2*i+1; int b = a+1; if(b<sz&&heap[b].fuel>heap[a].fuel) a = b; if(heap[a].fuel>x.fuel) { heap[i] = heap[a]; i = a; } else break; } heap[i] = x; return ret;}class comp1{ public: bool operator()(const Node& a,const Node& b) { return a.dis<b.dis; }};class comp2{ public: bool operator()(const Node& a,const Node& b) { return a.fuel<b.fuel; }};vector<Node> v;int main(){ int n; cin>>n; int i; int l,p; v.push_back(Node(0,0)); for(i=0;i<n;i++) { int a,b; cin>>a>>b; v.push_back(Node(a,b)); } cin>>l>>p; sort(v.begin(),v.end(),comp1()); i = v.size()-1; int cnt = 0; while(i>=0) { int d = l - v[i].dis; p -= d; l = v[i].dis; if(p<0) { while(sz>0&&p<0) { Node t = pop(); p += t.fuel; cnt++; //cout<<t.dis<<endl; } if(p<0) { cout<<"-1"<<endl; return 0; } } push(v[i]); i--; } cout<<cnt<<endl; return 0;}
结果:Memory: 520K Time: 172MS
所以标准库还是很给力的,还有就是可能我自己的优先队列实现太渣了。。
阅读全文
0 0
- poj 2431 解题记录
- poj 1423解题记录
- 个人POJ解题记录【不断更新】
- POJ 2431Expedition(优先队列解题)
- 【POJ解题】:POJ 2141解题报告
- sgu 125解题记录
- sgu 114解题记录
- sgu 131解题记录
- sgu 136解题记录
- sgu 138解题记录
- sgu 142解题记录
- sgu 149解题记录
- [LeetCode] Triangle 解题记录
- LeetCode解题记录
- [BZOJ2299][向量]解题记录
- 【p1042-乒乓球】解题记录
- 【p1093-奖学金】解题记录
- 【p1605-迷宫】解题记录
- No bean named 'springSecurityFilterChain' is defined
- Spark与机器学习(一)
- maven管理地址
- jQuery省市区三级联动
- 纯JS省市区三级联动
- poj 2431 解题记录
- java 打包项目为jar文件 并运行 外部配置文件
- Reinforcement Learning: Planning by DP
- jQuery:事件操作(二)
- 直接使用Sublime Text实现:HTTP访问URL+格式化返回的JSON字符串
- Django分页后,序号如何按照数据自增
- jQuery:动画大全
- Sssion与Cookie基本原理
- 浅谈HTTP中Get与Post的区别