1. 程式人生 > 實用技巧 >洛谷 P4053 [JSOI2007]建築搶修(反悔貪心)

洛谷 P4053 [JSOI2007]建築搶修(反悔貪心)

傳送門


解題思路

反悔貪心。按照結束時間排序,然後列舉結束時間,能修就修,不能修就比較以前修過的耗時最長的建築和當前這個建築比較是否更優。

注意這裡用大根堆。

AC程式碼

 1 #include<iostream>
 2 #include<cmath>
 3 #include<cstring>
 4 #include<queue>
 5 #include<algorithm>
 6 #include<cstdio>
 7 using namespace std;
 8 const int maxn=150005;
 9 int
n,ans; 10 long long last,now; 11 struct node{ 12 long long t1,t2; 13 }a[maxn]; 14 bool cmp(node a,node b){ 15 return a.t1<b.t1; 16 } 17 priority_queue<long long> q; 18 int main(){ 19 cin>>n; 20 for(int i=1;i<=n;i++) scanf("%lld%lld",&a[i].t2,&a[i].t1); 21 sort(a+1
,a+n+1,cmp); 22 for(int i=1;i<=n;i++){ 23 now=a[i].t1; 24 last+=now-a[i-1].t1; 25 if(last>=a[i].t2){ 26 last-=a[i].t2; 27 q.push(a[i].t2); 28 ans++; 29 }else{ 30 if(!q.empty()&&q.top()>a[i].t2){ 31 last+=q.top()-a[i].t2;
32 q.pop(); 33 q.push(a[i].t2); 34 } 35 } 36 } 37 cout<<ans; 38 return 0; 39 }

//JSOI 2007