洛谷 P4053 [JSOI2007]建筑抢修(调整法贪心)

题目链接: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 }
AC代码

 

posted @ 2020-08-02 06:35  dfydn  阅读(174)  评论(0)    收藏  举报