POJ 2431 Expedition(优先队列)

题目链接:http://poj.org/problem?id=2431

优先队列解就好了,预处理有点繁琐,不过处理好了就ojbk。

 /*
 qq:1239198605
 ctgu_yyf
        */

#include<iostream>
#include<cstdio>
#include<string>
#include<vector>
#include<queue>
#include<stack>
#include<cstring>
#include<algorithm>
#include<cmath>
#define ll long long
using namespace std;

priority_queue<int,vector<int>,less<int> >p; 
struct Node{
	int distance;
	int oil;
	int oilr;
	int distancer;
}node[10005];

//结构体排序 
bool cmp(const Node &a,const Node &b)
{
	return a.distance<b.distance;
}

int main()
{
   ios::sync_with_stdio(false);
   int n;
   cin>>n;
   
   
   	for(int i=0;i<n;i++)
   	cin>>node[i].distance>>node[i].oil;
   	
   	
   	
   	int dis,oilx,kk=0;
   	cin>>dis>>oilx;
   	
   	for(int i=0;i<n;i++)
   	node[i].distance=dis-node[i].distance;
   	
   	sort(node,node+n,cmp);
   	
   	
   	//预处理   
   	kk=node[0].distancer=node[0].distance;
   	
   	for(int i=1;i<n;i++)
   	{
   	node[i].distancer=node[i].distance-node[i-1].distance;
   	kk+=node[i].distancer;}
   	
   	node[n].distancer=dis-kk;
   	
   	
   	for(int i=1;i<=n;i++)
   	node[i].oilr=node[i-1].oil;
   	
   	
	
	      	
    int ans=oilx-node[0].distancer;
    int j=0;
   	int sum=0;
   
   
   //优先队列 
   	for(int i=1;i<=n;i++)
   	{
   		p.push(node[i].oilr);
   		if(ans<node[i].distancer)
   		{
   			while(!p.empty())
   			{
   				ans+=p.top();
   				p.pop();
   				sum++;
   				if(ans>=node[i].distancer)
				   break; 
			   }
		   }
   		ans-=node[i].distancer;
   		if(ans<0)
   	    break;
   	
   }
   
   if(ans<0)
   cout<<"-1"<<endl;
   else
   cout<<sum<<endl;



return 0;
}

猜你喜欢

转载自blog.csdn.net/k_koris/article/details/80712667