题目链接:https://www.luogu.com.cn/problem/P4053
调整法贪心即为:先钦定一种解为最优解。当发现它不是最优的时候就进行修改。
这个题可以先按照t2排序,让时间顺序。从前往后扫,如果此时T+t1>t2时,发现当前情况可能不是最优的了,那么就将前面耗时最长(且大于t1)的替换掉。此时,T+t1一定<t2,而每一个建筑的贡献是相同的,这样对后面是更优的。如果T+t1<=t2,那么就先要着这个,不行后面再调整。
注意时间T的处理。
AC代码:
1 #include<cstdio> 2 #include<iostream> 3 #include<algorithm> 4 #include<queue> 5 using namespace std; 6 priority_queue<int> q; 7 int T,ans; 8 struct node{ 9 int t1,t2; 10 }a[150005]; 11 bool cmp(node x,node y){ 12 return x.t2<y.t2; 13 } 14 int main(){ 15 int n; 16 scanf("%d",&n); 17 for(int i=1;i<=n;i++) 18 scanf("%d%d",&a[i].t1,&a[i].t2); 19 sort(a+1,a+n+1,cmp); 20 for(int i=1;i<=n;i++){ 21 if(T+a[i].t1>a[i].t2){ 22 if(a[i].t1<q.top()){ 23 T=T-q.top()+a[i].t1; 24 q.pop(); 25 q.push(a[i].t1); 26 } 27 } 28 else{ 29 q.push(a[i].t1); 30 ans++; 31 T+=a[i].t1; 32 } 33 } 34 printf("%d",ans); 35 return 0; 36 }