1. 程式人生 > >51Nod 1428 活動安排問題 貪心

51Nod 1428 活動安排問題 貪心

有若干個活動,第i個開始時間和結束時間是[Si,fi),同一個教室安排的活動之間不能交疊,求要安排所有活動,最少需要幾個教室? 

收起

輸入

第一行一個正整數n (n <= 10000)代表活動的個數。
第二行到第(n + 1)行包含n個開始時間和結束時間。
開始時間嚴格小於結束時間,並且時間都是非負整數,小於1000000000

輸出

一行包含一個整數表示最少教室的個數。

輸入樣例

3
1 2
3 4
2 9

輸出樣例

2

 思路:

先將時間表按照起始時間從小到大排序,如果相等的話,再按末尾時間從小到大排序。

然後新增教室,如果一個教室的結束時間小於等於時間表的開始時間的話,則可以進行活動。

如果所有的教室都不滿足條件的話,則需要新增教室。

程式碼如下:

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;
const int maxn=10005;
int n;
struct ti
{
    int s,e;
};
ti t[maxn];
vector<ti>v;
int compare (ti a,ti b)
{
    if(a.s<b.s)
    {
        return 1;
    }
    else if(a.s==b.s)
    {
        if(a.e<b.e)
        {
            return 1;
        }
        else
            return 0;
    }
    else
        return 0;
}
int main()
{
    scanf("%d",&n);
    for (int i=0;i<n;i++)
    {
        scanf("%d%d",&t[i].s,&t[i].e);
    }
    sort (t,t+n,compare);
    for (int i=0;i<n;i++)
    {
        int Size=v.size();
        int flag=0;
        for (int j=0;j<Size;j++)
        {
            if(v[j].e<=t[i].s)
            {
                flag=1;
                v[j]=t[i];
                break;
            }
        }
        if(!flag)
        {
            v.push_back(t[i]);
        }
    }
    printf("%d\n",v.size());
    return 0;
}