bzoj 1029
贪心加优先队列维护。
先把每个建筑的t1和t2读进来,然后按照t2排序。
枚举建筑,当枚举到第i个建筑时,ans表示在t2[i-1]范围内可以修的最多建筑,now表示修这些建筑所需的最少时间。
如果可以修第i个建筑,即t1[i]+now<=t2[i],则now+=t1[i]。
否则就判断是否要不修已经选了的建筑中的t1最大值,来修第i个建筑,来维护now的最优性。
用优先队列维护已经选了的建筑中的t1最大值。
#include"cstdio" #include"cctype" #include"queue" #include"algorithm" using namespace std; int read() { int c,x=0; while(!isdigit(c=getchar())); while(x=x*10+c-'0',isdigit(c=getchar())); return x; } struct building { int t1,t2; }a[150001]; bool comp(building a,building b) { return a.t2<b.t2; } priority_queue<int> q; int main() { int n=read(),now=0,ans=0; for(int i=1; i<=n; i++) a[i].t1=read(),a[i].t2=read(); sort(a+1,a+n+1,comp); for(int i=1; i<=n; i++) if(a[i].t1+now<=a[i].t2) { now+=a[i].t1; ans++; q.push(a[i].t1); } else if(a[i].t1<q.top()) { now+=a[i].t1-q.top(); q.pop(); q.push(a[i].t1); } printf("%d",ans); return 0; }