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;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章