cf#579 F2
http://codeforces.com/contest/1203/problem/F2
F2. Complete the Projects (hard version)
time limit per test2 seconds
memory limit per test256 megabytes
inputstandard input
outputstandard output
The only difference between easy and hard versions is that you should complete all the projects in easy version but this is not necessary in hard version.
Polycarp is a very famous freelancer. His current rating is r units.
Some very rich customers asked him to complete some projects for their companies. To complete the i-th project, Polycarp needs to have at least ai units of rating; after he completes this project, his rating will change by bi (his rating will increase or decrease by bi) (bi can be positive or negative). Polycarp’s rating should not fall below zero because then people won’t trust such a low rated freelancer.
Polycarp can choose the order in which he completes projects. Furthermore, he can even skip some projects altogether.
To gain more experience (and money, of course) Polycarp wants to choose the subset of projects having maximum possible size and the order in which he will complete them, so he has enough rating before starting each project, and has non-negative rating after completing each project.
Your task is to calculate the maximum possible size of such subset of projects.
Input
The first line of the input contains two integers n and r (1≤n≤100,1≤r≤30000) — the number of projects and the initial rating of Polycarp, respectively.
The next n lines contain projects, one per line. The i-th project is represented as a pair of integers ai and bi (1≤ai≤30000, −300≤bi≤300) — the rating required to complete the i-th project and the rating change after the project completion.
Output
Print one integer — the size of the maximum possible subset (possibly, empty) of projects Polycarp can choose.
Examples
inputCopy
3 4
4 6
10 -2
8 -1
outputCopy
3
inputCopy
5 20
45 -6
34 -15
10 34
1 27
40 -45
outputCopy
5
inputCopy
3 2
300 -300
1 299
1 123
outputCopy
3
算减少部分的时候,如果不满足条件,就在前面找减得最多的(优先队列,开始的两个为什么要那样建优先队列前一篇有证明
#include<stdio.h>
#include<queue>
using namespace std;
struct node1
{
int num,d;
bool operator < (const node1& b) const
{
return num>b.num;
}
};
struct node2
{
int num,d;
bool operator < (const node2& b) const
{
return num<b.num;
}
};
priority_queue<node1> q1;
priority_queue<node2> q2;
priority_queue<int,vector<int>,greater<int> >q;
int main()
{
int n,r;
int tmp1,tmp2;
scanf("%d%d",&n,&r);
int ans=0;
for(int i=0;i<n;i++)
{
scanf("%d%d",&tmp1,&tmp2);
if(tmp2>=0)
{
node1 tmp;
tmp.num=tmp1;
tmp.d=tmp2;
q1.push(tmp);
}
else
{
node2 tmp;
tmp.num=tmp1+tmp2;
tmp.num=max(tmp.num,0);
tmp.d=tmp2;
q2.push(tmp);
}
}
while(!q1.empty())
{
node1 tmp=q1.top();
q1.pop();
if(r<tmp.num)
{
continue;
}
r+=tmp.d;
ans++;
}
while(!q2.empty())
{
node2 tmp=q2.top();
q2.pop();
r+=tmp.d;
q.push(tmp.d);
if(r<tmp.num)
{
r-=q.top();
q.pop();
}
}
ans+=q.size();
printf("%d\n",ans);
return 0;
}
上一篇: 图片缩放
下一篇: g2 自定义 tooltip