[置顶] POJ 2431 EXPEDITION 非 优先队列的 c++ 做法
2017-12-26 18:43
495 查看
原题见
:::::::::http://poj.org/problem?id=2431::::::::::::
<---------------------------------------------------------------------------------------------------------------------->
题目大意:有一个人,他要开车去某地,他的车上有一个无穷大的油箱,这个加油站的油都是有限的。玄学的问题来了!!!!!!<这意味着它可以加完加油站所有的油<那不都是通了管道过来的吗,会加完是什么鬼>>不分析这个车和加油站的问题,我们来说输入输出。输入的东西也很有趣,它先输了加油站的数量,这似乎没什么问题;然后n行是每个加油站到<终点>的的距离,和这个加油站的油的量//因题知油量=可增加的里程数。最后输了初始位置离终点的距离,和初始油量。
加油站是一个类,于是我们想到了用建立加油站类(即结构体S)。d为到终点距离//经过①变化后是到起点距离;y位总油量。
首先,这个距离是反的会让人特别不爽,于是我们选择把它转化掉。①
一看这个问题,首先想到的就是贪心,部分最优寻求整体最优。
<———————————————思路分析—————————————————————>
那么我们知道初始的油量是它开车不加油的最大路程,如果他本来就能到终点,那么返回0;
如果初始油量不足,就加上他走过路程中加油站油量最大的那个站的量。并清空那个加油站即吧那个加油站油量改成0;为了做到这个我们要吧这个加油站类放到一个数组里,并按d排序。
依次类推。
如果每次都执行这样的操作能够到达终点则返回加油次数。
反之,如果到了某个位置他经过的所有加油站油量均为0则他无法到达。
<——————————————参考代码———————————————————>
:::::::::http://poj.org/problem?id=2431::::::::::::
<---------------------------------------------------------------------------------------------------------------------->
题目大意:有一个人,他要开车去某地,他的车上有一个无穷大的油箱,这个加油站的油都是有限的。玄学的问题来了!!!!!!<这意味着它可以加完加油站所有的油<那不都是通了管道过来的吗,会加完是什么鬼>>不分析这个车和加油站的问题,我们来说输入输出。输入的东西也很有趣,它先输了加油站的数量,这似乎没什么问题;然后n行是每个加油站到<终点>的的距离,和这个加油站的油的量//因题知油量=可增加的里程数。最后输了初始位置离终点的距离,和初始油量。
加油站是一个类,于是我们想到了用建立加油站类(即结构体S)。d为到终点距离//经过①变化后是到起点距离;y位总油量。
首先,这个距离是反的会让人特别不爽,于是我们选择把它转化掉。①
一看这个问题,首先想到的就是贪心,部分最优寻求整体最优。
<———————————————思路分析—————————————————————>
那么我们知道初始的油量是它开车不加油的最大路程,如果他本来就能到终点,那么返回0;
如果初始油量不足,就加上他走过路程中加油站油量最大的那个站的量。并清空那个加油站即吧那个加油站油量改成0;为了做到这个我们要吧这个加油站类放到一个数组里,并按d排序。
依次类推。
如果每次都执行这样的操作能够到达终点则返回加油次数。
反之,如果到了某个位置他经过的所有加油站油量均为0则他无法到达。
<——————————————参考代码———————————————————>
#include<cstdio> #include<iostream> #include<algorithm> #define N 100000+10 #define INF 0x3f3f3f3f using namespace std; typedef long long ll; int n; typedef struct { int d; int y; }S; S a ; int is(int p,int l){ int k=0; while(p<l){ int m; int i,t=0,j=-1; for(i=0;i<n;i++){ m=a[i].d; if(m>p){ if(j==0)return -1; break; } if(a[i].y>j){ j=a[i].y; t=i; } } a[t].y=0; p+=j; k++; } return k; } int cmp(S a,S b){ return a.d<b.d; } int main() { while(cin>>n){ for(int i=0;i<n;i++){ cin>>a[i].d>>a[i].y; } int l,p; cin>>l>>p; //① for(int i=0;i<n;i++){ a[i].d=l-a[i].d; } sort(a,a+n,cmp); if(p>l){ cout<<0<<endl; } else{ int k=is(p,l); cout<<k<<endl; } } return 0; }
相关文章推荐
- poj2431 Expedition 优先队列
- POJ 2431 Expedition 贪心 + 优先队列
- POJ - 2431 Expedition :贪心+优先队列
- Expedition(POJ 2431) 优先队列
- poj 2431 Expedition 【优先队列】
- POJ 2431-Expedition [优先队列] 《挑战程序设计竞赛》2.4
- poj 2431 Expedition 优先队列 大顶堆
- POJ 2431 Expedition (优先队列
- POJ 2431 Expedition(优先队列、贪心)
- POJ 2431 Expedition (优先队列 + 贪心)
- Poj—2431 Expedition 优先队列使用经典例题
- 优先队列 POJ 2431 Expedition
- POJ2431 Expedition【贪心+优先队列】
- poj-2431 贪心+优先队列
- poj 2431 poj 3253 优先队列的运用
- [置顶] 【数据结构】【C++STL】动态数组 集合 映射和优先队列
- POJ 2431 be84 - Expedition ( 优先队列 )
- POJ 2431 Expedition (STL 优先权队列)
- POJ 2431 Expedition (贪心 + 优先级队列)
- POJ 2431 Expedition (STL 优先权队列)