【貪心】【堆】Gym - 101485A - Assigning Workstations
阿新 • • 發佈:2017-10-20
space tdi %d light 分配 can reat 排序 關閉
題意:有n個人,依次來到機房,給你他們每個人的到達時間和使用時間,你給他們分配電腦,要麽新開一臺, 要麽給他一臺別人用完以後沒關的。一臺電腦會在停止使用M分鐘後自動關閉。讓你最大化不需要新開電腦的總人數。
將人按照到達時間進行排序,把所有已經處理完的人的結束時間塞在小根堆裏面。新來一個人的時候,從堆頂把結束時間過早的全pop掉,然後看堆頂的能不能直接分配給他,如果能,就將那個pop掉,然後將這個人塞進去。否則直接塞進去,然後ans++。
最後輸出n-ans即可。
#include<cstdio> #include<queue> #include<algorithm> using namespace std; typedef pair<int,int> Point; priority_queue<int,vector<int>,greater<int> >Heap; int n,m,ans; Point a[300005]; int main(){ // freopen("a.in","r",stdin); scanf("%d%d",&n,&m); for(int i=1;i<=n;++i){ scanf("%d%d",&a[i].first,&a[i].second); } sort(a+1,a+n+1); for(int i=1;i<=n;++i){ while(!Heap.empty() && Heap.top()<a[i].first-m){ Heap.pop(); } if(Heap.empty() || Heap.top()>a[i].first){ ++ans; } else{ Heap.pop(); } Heap.push(a[i].first+a[i].second); } printf("%d\n",n-ans); return 0; }
【貪心】【堆】Gym - 101485A - Assigning Workstations