每次为何自己贪心就不能一次A呢= =
按照修理完毕的限定时间从小到大排序
1、如果当前建筑可修理,则修理
2、如果当前建筑不可修理,则和已经修理的建筑最大的修理时间比较,用堆维护最大值。
#include<cstdio>
#include<queue>
#include<algorithm>
using namespace std;
struct building
{
int t1,t2;
bool operator< (building y) const
{
return t2<y.t2;
}
}a[150001];
priority_queue<int> Q;
int main()
{
int n;
scanf("%d",&n);
int i;
for(i=1;i<=n;i++)
scanf("%d%d",&a[i].t1,&a[i].t2);
sort(a+1,a+1+n);
int sum=0,ans=0;
for(i=1;i<=n;i++)
{
if(sum+a[i].t1<=a[i].t2)
{
ans++;
Q.push(a[i].t1);
sum+=a[i].t1;
}
else
{
if(Q.empty())
continue;
int t=Q.top();
if(t<=a[i].t1)
continue;
sum-=t;
sum+=a[i].t1;
Q.pop();
Q.push(a[i].t1);
}
}
printf("%d\n",ans);
return 0;
}