题目链接:点击打开链接
题目大意:任选一个时刻开始,每隔五分钟可以在这个时刻选择一门且只能选择小于等于一门课程,每门课程有一个有效期,可以在这个有效期内选择且这个有效期为【t1, t2)形式 !! 然后让你找出最多能选择几门课程
解题思路:先确定在什么时候开始,开始时间只需要在0 ~ 4之间列举即可,剩下的就都能取到了,
开始时间确定了,然后开始求在不同开始时间内能选择到的最多科目数,这时候就该用到贪心的思想了,都在有效期内的两个课程选择结束时间最早的课程,这样就可以不浪费时间选择尽可能多的课程
代码:
//HDU 3697 暴力 + 贪心
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
class course
{
public:
int st;
int en;
course(int s, int e): st(s), en(e) {}
course(): st(0), en(0) {}
};
bool cmp(course c1, course c2)
{
if(c1.en < c2.en) return true;
else return false;
}
int main()
{
int n;
course c[310];
while(scanf("%d", &n) && n != 0)
{
for(int i = 0; i < n; i++)
{
cin >> c[i].st >> c[i].en;
}
sort(c, c+n, cmp); //按结束时间进行排序
// for(int i = 0; i < n; i++)
// cout << c[i].st << " " << c[i].en << endl;
int vis[310];
int select = 0;
for(int i = 0; i < 5; i++) //开始时间
{
int select1 = 0;
memset(vis, 0, sizeof(vis));
for(int k = i; k <= c[n-1].en; k += 5)
{
for(int j = 0; j < n; j++)
{
if(k >= c[j].st && k < c[j].en && vis[j] == 0)
{ select1++; vis[j] = 1; break;}
}
}
if(select1 > select) select = select1;
}
cout << select << endl;
}
return 0;
}