A - Expedition(优先队列+思维)

在这里插入图片描述
这题让我无语了,我开始就是用贪心写的,结果t了,我还在想才3e5就t,我也是无语了,后来我又改了一下优先队列,然后AC;
题意:就是给你到town的距离和当前站的油量,让你算从开始的p单位油量到终点最少需要停多少站就能到达终点;
很明显题给的是stop到town的距离所以需要用总距离-给的距离;
思路:把最后终点当做stop只不过dis=总距离,fuel=0;用[0,n]遍历距离;如果距离小于初始油量,那么久放入stop的fuel值到优先队列;如果大于了,那么久一直加到能到当前枚举到的站,才结束循环;所以AC代码:

#include<cstdio>
#include<iostream>
#include<queue>
#include<algorithm>
using namespace std;
struct Node{
	int d,fuel;
}p[100010];
bool cmp(Node a, Node b){
	  return a.d<b.d;
}
int main(){
	int n;
	priority_queue<int> q;
	scanf("%d",&n);
	for(int i=0;i<n;i++){
		  scanf("%d %d",&p[i].d,&p[i].fuel);
	}
	int dis,all;
	scanf("%d %d",&dis,&all);
	for(int i=0;i<n;i++){
		 p[i].d=dis-p[i].d;
	}
	sort(p,p+n,cmp);
//	int Max=0,num=0;//这里就是t的部分,超无语。。。。。。
//	while(q.size()){
//		  if(q.top().d<=all){
//		  	    Max=max(q.top().fuel,Max);
//		  	    q.pop();
//		  }else{
//		  	all+=Max;
//		  	Max=0;
//		  	  num++;
//		  	  if(all>=dis){
//		  	  	  return printf("%d\n",num),0;
//				}
//		  }
//	}
//	puts("-1");
   int num=0;
   p[n].d=dis;p[n].fuel=0;//把终点当一个油站
  for(int i=0;i<=n;i++){
  	  while(all<p[i].d){//如果油量小于当前可达的距离,那么每次就加上前面all大于油站的距离的fuel的最大值
  	  	   if(q.empty()){//如果为空,说明根本不能到达这个stop,所以直接输出
  	  	   	 return puts("-1"),0;
  	  	   	 	}else{//不断加
  	  	   	 		   all+=q.top();
  	  	   	 		    q.pop();
  	  	   	 		    num++;
					}
			 
		}
		 q.push(p[i].fuel);//这里就是把all所能到达的stop的fuel给入队,并且大的排前面
  }
   printf("%d\n",num);
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值