1. 程式人生 > >【貪心】【堆】Gym - 101485A - Assigning Workstations

【貪心】【堆】Gym - 101485A - Assigning Workstations

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