优先队列 取最大值

poj题目

一辆车经过几个加油站,求能到达目的地的最少加油次数

一到没油的地方就找前面加油站中加油最多的地方加油

priority_queue<int que;


int n,l,pp,a[10020],b[10020];

struct node{
	int a,b;
}p[10005];

int cmp(node a,node b){
	return a.a<b.a;
}

void init(){
	cin>>n;
	for(int i=0;i<n;i++){
		cin>>p[i].a>>p[i].b;
	}
	cin>>l>>pp;
	for(int i=0;i<n;i++){
		p[i].a=l-p[i].a;
	} 
	sort(p,p+n,cmp);
}

void solve(){
	p[n].a=l;p[n].b=0;
	n++;
	priority_queue<int>que;//取出最大值
	//	priority_queue<int,vector<int>,greater<int> >que;每次取出最小值
	int ans=0,pos=0,tank=pp;
	for(int i=0;i<n;i++){
		int d = p[i].a-pos;
		while(tank-d<0){
			if(que.empty()){
				puts("-1");
				return ;
			}
			tank+=que.top();
			que.pop();
			ans++;
		}
		tank-=d;
		pos=p[i].a;
		que.push(p[i].b);
	}
	printf("%d\n",ans);
}

int main(){
	SIS;
	init();
	solve();
	
	return 0;
}
发布了20 篇原创文章 · 获赞 2 · 访问量 249

猜你喜欢

转载自blog.csdn.net/weixin_45535964/article/details/104975166