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,
然后要减去队列中需要最长时间的订单(即队首),一直贪心,最后留在队列中的订单个数就是保留的订单个数。
*/
//
keep moving...