lightoj1301Monitoring Processes

来源:互联网 发布:奥尼尔vs奥拉朱旺 数据 编辑:程序博客网 时间:2024/06/05 14:32

思路:有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_backtemplate<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;}


0 0
原创粉丝点击