思路
n很大,不可能是dp,考虑贪心。先按截至期限排序,如果有建筑不符合,就将之前耗时最长的弹出,用当前的替换,可以用堆实现。
1 #include<algorithm> 2 #include<iostream> 3 #include<cstdio> 4 #include<queue> 5 using namespace std; 6 const int N=150005; 7 int n,tim,ans; 8 struct node 9 { 10 int x,y; 11 }a[N]; 12 priority_queue<int>q; 13 bool cmp(node c,node d) 14 { 15 return c.y<d.y; 16 } 17 int main() 18 { 19 scanf("%d",&n); 20 for(int i=1;i<=n;i++) 21 scanf("%d%d",&a[i].x,&a[i].y); 22 sort(a+1,a+n+1,cmp); 23 for(int i=1;i<=n;i++) 24 if(tim+a[i].x<=a[i].y) 25 { 26 ans++; 27 tim+=a[i].x; 28 q.push(a[i].x); 29 } 30 else 31 { 32 if(a[i].x>=q.top()) 33 continue; 34 tim-=q.top()-a[i].x; 35 q.pop(); 36 q.push(a[i].x); 37 } 38 printf("%d\n",ans); 39 return 0; 40 }