1. 程式人生 > 實用技巧 >洛谷 P2107 小Z的AK計劃(反悔貪心)

洛谷 P2107 小Z的AK計劃(反悔貪心)

傳送門


解題思路

還是反悔貪心。按照位置從左到右排序,每走到一個新的機房就m減去走的路程,然後判斷剩下的時間夠不夠ak此機房,如果夠,就ak,並把時間加入到大根堆中,如果不夠,就比較堆頂,若當前更優,就彈出堆頂,把新元素加入堆。

AC程式碼

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