[置顶] POJ 2431 EXPEDITION 非 ...

原题见

:::::::::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[N];
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;
}


转载于:https://www.cnblogs.com/long-long-max/p/8592695.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值