51Nod 1428 活動安排問題 貪心
阿新 • • 發佈:2018-12-19
有若干個活動,第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; }