提交:bzoj1029
题目↑↑
这道题就是贪心
操作:先用操作时间从小到大将数组排序一遍,然后用multiset来记录进入队列的数(注意不能用set,因为set会去重,也要注意在删除一个元素时,不能将所有元素都删除,要在删了一个之后加回多删的数)
代码↓↓
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<set>
using namespace std;
multiset <int> S;
multiset <int> :: iterator it;
struct node
{
int x,y;
}a[210000];
int cmp(const void *xx,const void *yy)
{
node n1=*(node *)xx;
node n2=*(node *)yy;
return n1.y>n2.y;
}
int main()
{
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d%d",&a[i].x,&a[i].y);
qsort(a+1,n,sizeof(node),cmp);
int ans=0,head=1,tail=0,now=0;
S.clear();
for(int i=1;i<=n;i++)
{
if(now+a[i].x<=a[i].y)
{
ans++;
now+=a[i].x;
S.insert(a[i].x);
}
else
{
it=S.end();
it--;
int tt=*it;
if(a[i].x<tt)
{
int ss=S.count(tt);
S.erase(tt);
for(int j=1;j<ss;j++)
{
S.insert(tt);
}
S.insert(a[i].x);
now=now-tt+a[i].x;
}
}
}
printf("%d\n",ans);
return 0;
}