【题解】
仅按T1或T2从小到大修理显然是不正确的
用大根堆找出 这个j号即可
#include<stdio.h> #include<stdlib.h> int a[150005]={0},b[150005]={0},heap[150005]={0}; int p=0; void jh(int* a,int* b) { int t=*a; *a=*b; *b=t; } void kp(int low,int high) { int i=low,j=high,mid=b[(i+j)/2]; while(i<j) { while(b[i]<mid) i++; while(b[j]>mid) j--; if(i<=j) { jh(&a[i],&a[j]); jh(&b[i],&b[j]); i++; j--; } } if(j>low) kp(low,j); if(i<high) kp(i,high); } void tj(int x)//添加元素 { int i; heap[++p]=x; for(i=p;i!=1;i/=2) { if(heap[i]>heap[i/2]) jh(&heap[i],&heap[i/2]); else return; } } void sc()//删除堆顶 { int i=1; heap[1]=heap[p--]; while(i*2<=p) { i*=2; if(i+1<=p&&heap[i]<heap[i+1]) i++; if(heap[i]>heap[i/2]) jh(&heap[i],&heap[i/2]); else return; } } int main() { int n,i,t=0,ans=0; scanf("%d",&n); for(i=1;i<=n;i++) scanf("%d%d",&a[i],&b[i]); kp(1,n); for(i=1;i<=n;i++) { if(t+a[i]<=b[i]) { t+=a[i]; tj(a[i]); ans++; } else if(p>0&&heap[1]>a[i]) { t=t-heap[1]+a[i]; sc(); tj(a[i]); } } printf("%d",ans); return 0; }