题目链接:http://acm.hdu.edu.cn/listproblem.php?vol=27
题目描述:有n个课程,每个课程有一个时间段选课(为开区间),一个人可以从任意时刻选课,每隔五分中选一次课,问最多能够选多少们课?
分析: 这里只给出解法,先将每个选课区间按结束时间排序,然后枚举前0--4分钟,之后枚举选课时间,对每个选课时间看能否选一门课注意这里只能选择排序后的最早满足条件的一门,之后记录最大值即可
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=310;
struct node
{
int x,y;
}a[N];
bool cmp(node b,node c)
{
if(b.y==c.y)
return b.x < c.x;
return b.y < c.y;
}
bool vis[N];
int main ()
{
int n,i,k,x,j;
while (scanf("%d",&n)!=EOF)
{
if(n==0)break;
for(i=0;i<n;i++)
scanf("%d%d",&a[i].x,&a[i].y);
sort(a,a+n,cmp);
int max=1,num;
for(i=0;i<5;i++)
{
num=0;
memset(vis,0,sizeof(vis));
for(x=i;x<a[n-1].y;x+=5)
{
for(j=0;j<n;j++)
if(!vis[j]&&x>=a[j].x&&x<a[j].y)
{
num++;
vis[j]=1;
break;
}
}
if(num>max)
max=num;
}
printf("%d\n",max);
}
return 0;
}