简单贪心-hdu-3697-Selecting courses

来源:互联网 发布:喝咖啡会难怀孕吗 知乎 编辑:程序博客网 时间:2024/06/05 11:40

题目链接:

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


原创粉丝点击