暴力,贪心
每门课按结束时间从小到大排序,结束时间相同的按开始时间从小到大排序,这样按顺序选一定最优。
由题意可知,这个人开始选课的时间自由,一旦开始选课,只能每五分钟选一次,开始时间分别取0,、1、2、3、4,剩下的选课时间就固定了,暴力查找一下即可。
#include<stdio.h>
#include<iostream>
#include<math.h>
#include<string.h>
#include<iomanip>
#include<stdlib.h>
#include<ctype.h>
#include<algorithm>
#include<deque>
#include<functional>
#include<iterator>
#include<vector>
#include<list>
#include<map>
#include<queue>
#include<set>
#include<stack>
#include<sstream>
#define CPY(A,B)memcpy(A,B,sizeof(A))
typedef long long LL;
typedef unsigned long long uLL;
const int MOD=1e9+7;
const int INF=0x3f3f3f3f;
const LL INFF=0x3f3f3f3f3f3f3f3fLL;
const double EPS=1e-9;
const double OO=1e20;
const double PI=acos (-1.0);
int dx[]= {0,1,0,-1};
int dy[]= {1,0,-1,0};
int gcd (const LL &a,const LL &b) {return b==0?a:gcd (b,a%b);}
using namespace std;
const int maxn=500;
struct course {
int st,et;
bool f;//这门课是否已选
} C[303];
bool cmp (course a,course b) {
return a.et<b.et|| (a.et==b.et&&a.st<b.st);
}
int main() {
int n;
while (~scanf ("%d",&n) &&n) {
memset (C,0,sizeof C);
for (int i=0; i<n; ++i) {
scanf ("%d%d",&C[i].st,&C[i].et);
}
int ans=0;
sort (C,C+n,cmp);
for (int i=0; i<5; ++i) {
for (int j=0; j<n; ++j) {C[j].f=true;}
int anst=0;
for (int t=i; t<=C[n-1].et; t+=5) {
for (int j=0; j<n; ++j) {
if (t>=C[j].st&&t<C[j].et&&C[j].f) {
C[j].f=false;
anst++;
break;
}
}
}
ans=max (ans,anst);//五次取最大
}
printf ("%d\n",ans);
}
return 0;
}