您的位置:首页 > 编程语言 > C语言/C++

[置顶] POJ 2431 EXPEDITION 非 优先队列的 c++ 做法

2017-12-26 18:43 495 查看
原题见
:::::::::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;
}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: