Poj2786

#include<cstdio>

#include<queue>

#include<iostream>

#include<cstdlib>

#include<algorithm>

#define N 800000+5

using namespace std;

struct g{

	int cost;

	int date;

}a[N];

int n;

int cmp(const void *a,const void *b){

	return (*(struct g *)a).date>(*(struct g *)b).date?1:-1;

}

int main(){

	int i;

	while(scanf("%d",&n)==1){

		for(i=0;i<n;i++)

			scanf("%d%d",&a[i].cost,&a[i].date);

		qsort(a,n,sizeof(a[0]),cmp);

		 priority_queue<int> q;

		int ans=0;

		for(i=0;i<n;i++){

			if(ans+a[i].cost<=a[i].date){

				ans+=a[i].cost;

				q.push(a[i].cost);

			}

			else

				if(ans+a[i].cost>a[i].date&&!q.empty()&&a[i].cost<q.top()){

					ans+=a[i].cost;

					q.push(a[i].cost);

				}

				if(ans>a[i].date){

					ans-=q.top();

					q.pop();

				}

		}

		printf("%d\n",q.size());

	}

	return 0;

}

  

/*
用一个优先队列进行模拟(priority_queue)order的情况。
先按照截止日期due对Order进行从小到大的排序,用pass表示当前完成最多订单需要的最短的时间,
遍历Order,当pass + order[i].q <= order[i].d的时候,
表示可以正常完成该订单,进队,同时pass += order[i].q,
如果pass + order[i].q > order[i].d的时候,
则需要考虑order[i].q和队列中需要最长时间的订单之间的关系,
如果order[i].q较大,说明该订单不可能完成,否则入队,pass += order[i].q,
然后要减去队列中需要最长时间的订单(即队首),一直贪心,最后留在队列中的订单个数就是保留的订单个数。

*/
//

你可能感兴趣的:(poj)