lightoj 1301 - Monitoring Processes 贪心

给定n个任务,每个任务都有开始时间和结束时间,问要同时有多少台机器才能完成工作...

开始以为直接排序用优先队列就好了没想到WA了,当时想到了一些BUG...万一结束时间晚的那个开始时间太早,每次找出来最小的结束来做任务会有BUG...

然后考虑到任务看做线段来言,这个就是找出来一个点最多被覆盖多少次,那么这个题就成了某场BC的题目。

有个姿势就是线段拆成两个端点,遇到起点+1,终点-1,找出来过程最大的就好了。

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define ull unsigned long long
#define mod 1000000007
#define inf 0x3f3f3f3f
#define N 50100
using namespace std;
struct node
{
    int num,tmp;
}a[N*2];
int cmp(node a,node b)
{
    if(a.num==b.num)
        return a.tmp>b.tmp;
    return a.num<b.num;
}
int main()
{
    int t;
    scanf("%d",&t);
    for(int cas=1; cas<=t; cas++)
    {
        int n,s,t;
        scanf("%d",&n);
        for(int i=0;i<n;i++)
        {
            scanf("%d %d",&s,&t);
            a[i*2].num=s;
            a[i*2].tmp=1;
            a[i*2+1].num=t;
            a[i*2+1].tmp=-1;
        }
        sort(a,a+n*2,cmp);
        int ans=0,tmp=0;
        for(int i=0;i<n*2;i++)
        {
            tmp+=a[i].tmp;
            ans=max(ans,tmp);
        }
        printf("Case %d: %d\n",cas,ans);
    }
    return 0;
}


你可能感兴趣的:(贪心,lightoj)