poj 2786 Keep the Customer Satisfied(贪心+优先队列)

来源:互联网 发布:mac磁盘权限修复 编辑:程序博客网 时间:2024/05/01 16:29


Input

The first line contains the number n of orders (n can be as large as 800000 for some test cases). It is followed by n lines. Each of which describes an order made of two integer values: the amount of steel (in tons) required for the order (lower than 1000) and its due date (in seconds; lower than 2 x 106 ).

Output

You are required to compute an optimal solution and your program has to write the number of orders that are accepted.

Sample Input

67 158 206 84 93 215 22

Sample Output

4
<a target=_blank href="http://poj.org/problem?id=2786">http://poj.org/problem?id=2786</a>
按照任务的截止时间排序,然后使用优先队列,每次累加任务消耗时间,如果所用时间超过了限定时间,则从优先队列中取出时间消耗最大的任务。

#include<iostream>#include<algorithm>#include<string>#include<map>//int dx[4]={0,0,-1,1};int dy[4]={-1,1,0,0};#include<set>//int gcd(int a,int b){return b?gcd(b,a%b):a;}#include<vector>#include<cmath>#include<queue>#include<string.h>#include<stdlib.h>#include<cstdio>#define mod 1e9+7#define ll long longusing namespace std;int n;pair<int,int> x[800001]; int cmp(pair<int,int>a,pair<int,int>b){return a.second<b.second;}int main(){scanf("%d",&n);for(int i=0;i<n;++i){scanf("%d %d",&x[i].first,&x[i].second);//需要的工作时间和截止日期 }sort(x,x+n,cmp);   //按截止日期排序 int s=n,sum=0;priority_queue<int> q;  //默认是从大到小排序(需要的工作时间)for(int i=0;i<n;++i){q.push(x[i].first);sum+=x[i].first;if(sum>x[i].second){s--;sum-=q.top();  //舍去需要的工作时间最久的 q.pop(); }}printf("%d",s);    return 0;}


0 0