HDU 3697 Selecting courses (水题,贪心)

题目

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

Source

2010 Asia Fuzhou Regional Contest

posted @ 2015-08-13 01:13  ACM_Record  阅读(122)  评论(0编辑  收藏  举报