lightoj1301Monitoring Processes

思路:有n个进程,开始时间s[i],结束时间t[i],我们要用监视器来监视这些进程,但是每个监视器同一时间只能监视一个进程,只有当这个监视器监视的进程结束后才能监视下一个,问需最少要多少个监视器才能监视完所有进程。

这题也是贪心,n个进程有2n个时间点,一个时间点要么是一个进程的开始,要么是一个进程的结束,开始的话就需要派监视器来监管,这个监视器有两个来源,一是前面已经监视完别的进程而空下来的,再就是额外添加的,所以我们需要一个pre来记录到目前为止需要多少个,ans表示到目前为止添加了多少个。存在同个时间是某些进程的开始,也是某些进程的结束,由于同一时间不能监视两个,所以要先算开始的,再算结束的。开始就需要的++,结束的就需要的--,再与已有的进行大小比较取最大就好了。

// #pragma comment(linker, "/STACK:1024000000,1024000000")
#include <iostream>
#include <algorithm>
#include <iomanip>
#include <sstream>
#include <string>
#include <stack>
#include <queue>
#include <deque>
#include <vector>
#include <map>
#include <set>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <climits>
using namespace std;
// #define DEBUG
#ifdef DEBUG
#define debug(...) printf( __VA_ARGS__ )
#else
#define debug(...)
#endif
#define CLR(x) memset(x, 0,sizeof x)
#define MEM(x,y) memset(x, y,sizeof x)
#define pk push_back
template<class T> inline T Get_Max(const T&a,const T&b){return a < b?b:a;}
template<class T> inline T Get_Min(const T&a,const T&b){return a < b?a:b;}
typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int,int> ii;
const double eps = 1e-10;
const int inf = 1 << 30;
const int INF = 0x3f3f3f3f;
const int MOD = 1e9 + 7;
ii A[100010];
int main()
{	
	freopen("in.txt","r",stdin);
	// freopen("out.txt","w",stdout);
	int t, n, icase = 0;
	scanf("%d",&t);
	while(t--){
		scanf("%d",&n);
		int top = 0;
		for (int i = 1, x, y;i <= n;++i){
			scanf("%d%d",&x,&y);
			A[top++] = ii(x,-1);
			A[top++] = ii(y, 1);
		}
		sort(A,A+top);
		int ans = 0, pre = 0;
		for (int i = 0;i < top;++i){
			pre -= A[i].second;
			if (pre > ans) ans = pre;
		}
		printf("Case %d: %d\n", ++icase, ans);
	}
	return 0;
}


你可能感兴趣的:(lightoj,机智的排序贪心)