题目链接:
http://acm.hdu.edu.cn/showproblem.php?pid=3697
题目大意:
有n门课程(n<=300),每门课程有个选课的时间段s,e,只能在s之后,在e之前选择该门课程。每位同学可以选择任意一个开始时间,然后每5分钟有一次选课机会,问每位同学最多可以选多少门课。
解题思路:
由于课程的选课时间是整数,对于整数开始点b,b+eps开始点更优。而且对于b~b+1之间的所有开始点,都与b+eps能选的最多课程数量相同。
贪心策略:对于截止时间早的先选。直接暴力枚举开始点,枚举每个能选的时刻就行了。
代码:
#include<iostream>
#include<cmath>
#include<cstdio>
#include<sstream>
#include<cstdlib>
#include<string>
#include<cstring>
#include<algorithm>
#include<vector>
#include<map>
#include<set>
#include<stack>
#include<list>
#include<queue>
#include<ctime>
#include<bitset>
#define eps 1e-6
#define INF 0x3f3f3f3f
#define PI acos(-1.0)
#define ll __int64
#define LL long long
#define lson l,m,(rt<<1)
#define rson m+1,r,(rt<<1)|1
#pragma comment(linker, "/STACK:1024000000,1024000000")
using namespace std;
#define Maxn 330
struct Inf
{
int s,e;
}inf[Maxn];
bool cmp(struct Inf a,struct Inf b)
{
if(a.e!=b.e)
return a.e<b.e;
return a.s<b.s;
}
bool vis[Maxn];
int main()
{
int n;
while(scanf("%d",&n)&&n)
{
for(int i=1;i<=n;i++)
scanf("%d%d",&inf[i].s,&inf[i].e);
sort(inf+1,inf+n+1,cmp);
int ans=0;
for(int i=0;i<5;i++)
{
int res=0,pos=1;
memset(vis,false,sizeof(vis));
for(int j=i;j<inf[n].e;j+=5)
{
for(int k=1;k<=n;k++)
{
if(vis[k])
continue;
if(inf[k].s<=j&&inf[k].e>j)
{
vis[k]=true,res++;
break;
}
}
}
ans=max(ans,res);
}
printf("%d\n",ans);
}
return 0;
}