题目
http://acm.hdu.edu.cn/showproblem.php?pid=3697
题意
有N门课,每门课有起始和结束时间\((A_i, B_i)\),同一时间只能选一门课,起始时间任意,但是起始时间确定后只能每隔五分钟再选择,求最大选课数
解法
由题意可知开始时间只有{0, 1, 2, 3, 4}五种可能,枚举每种可能,对于j时刻,若有多门课符合,选择结束时间最早的
注意区间为左闭右开
代码
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int N = 301;
int vis[N];
struct Node {
int l, r;
} p[N];
int main() {
int n;
while(scanf("%d", &n) && n) {
int _max = 0;
for(int i = 0; i < n; i++) {
scanf("%d%d", &p[i].l, &p[i].r);
if(_max < p[i].r)
_max = p[i].r;
}
int ans = 0;
for(int i = 0; i <= 4; i ++) {
memset(vis, 0, sizeof(vis));
int cnt = 0;
int pos = 0;
for(int j = i; j <= _max; j += 5) {
int flag = 0;
for(int k = 0; k < n; k++) {
if(!vis[k] && p[k].l <= j && p[k].r > j) {
if(flag) {
if(p[k].r < p[pos].r) {
vis[pos] = 0;
vis[k] = 1;
pos = k;
}
}
else {
vis[k] = 1;
cnt++;
flag = 1;
pos = k;
}
}
}
}
if(ans < cnt)
ans = cnt;
}
printf("%d\n", ans);
}
return 0;
}