基准时间限制:1 秒 空间限制:131072 KB 分值: 10
难度:2级算法题
有若干个活动,第i个开始时间和结束时间是[Si,fi),同一个教室安排的活动之间不能交叠,求要安排所有活动,最少需要几个教室?
Input
第一行一个正整数n (n <= 10000)代表活动的个数。 第二行到第(n + 1)行包含n个开始时间和结束时间。 开始时间严格小于结束时间,并且时间都是非负整数,小于1000000000
Output
一行包含一个整数表示最少教室的个数。
Input示例
3 1 2 3 4 2 9
Output示例
2
经典的贪心算法
结构体存储数据
按开始 结束 升序 排序
往房间数组中塞
房间数组中只存结束时间
塞数规则:
如果当前活动 i 的 开始时间 大于 房间数组 中的 结束时间
就用 当前活动 i 的 结束时间 替换掉 房间数组 中的 结束时间
如果所有 房间数组 中的 结束时间 都比 活动 i 中的 开始时间 大
那么再开一个房间 结束时间 赋值为当前活动 i 的结束时间;
#include <iostream> #include <algorithm> using namespace std; int clas[10000] = {0};//房间数组 struct active { int beg; int end; }arr[11000]; bool cmp(active x, active y) { if(x.beg != y.beg) return x.beg < y.beg; else return x.end < y.end; } int main() { ios::sync_with_stdio(false); int n, flag = 1; cin>>n; for(int i = 0; i < n; i++) { cin>>arr[i].beg>>arr[i].end; } sort(arr, arr + n, cmp); /*for(int i = 0; i < n; i++) { cout<<arr[i].beg<<' '<<arr[i].end<<endl; }*/ for(int i = 0; i < n; i++) { int j; for(j = 0; j < flag; j++) { if(arr[i].beg >= clas[j]) { clas[j] = arr[i].end; break; } } if(j == flag) { clas[flag ++] = arr[i].end; } } cout<<flag<<endl; return 0; }