HDU-3697-Selecting courses(贪心+优先队列)
2016-08-07 16:29
357 查看
题意:模拟选课,有n门课,一门课只可以在特定的时间区间里选(左闭右开区间),每个学生每隔5分钟可以选一次课,每次仅选一门,也可不选,求出能选择的最多的课程数量。
思路:贪心思想,枚举开始时间0~4,这样可以覆盖住全部的时间点,对与每个开始时间,模拟时间增加并选课,到达一个时间t后,把已开始未结束的课程加进队列里,结束时间早的课程优先选择,这样结束时间晚的课程可以等到下一个时间点选,以这种策略可以得到最大结果。
细节参见代码:
思路:贪心思想,枚举开始时间0~4,这样可以覆盖住全部的时间点,对与每个开始时间,模拟时间增加并选课,到达一个时间t后,把已开始未结束的课程加进队列里,结束时间早的课程优先选择,这样结束时间晚的课程可以等到下一个时间点选,以这种策略可以得到最大结果。
细节参见代码:
// lsltbh #include<iostream> #include<cstdio> #include<cstring> #include<string> #include<map> #include<vector> #include<queue> #include<algorithm> #include<cstdlib> using namespace std; struct node{ int b; int e; bool operator<(const node &a) const { if(e!=a.e) return e>a.e; return b>a.b; } }; node nod[305]; int n,t; int maxn; int main() { while(~scanf("%d",&n)&&n) { for(int i=0;i<n;i++) { scanf("%d%d",&nod[i].b,&nod[i].e); if(!i) maxn=nod[i].e; else maxn=max(maxn,nod[i].e); } int ans[10]; memset(ans,0,sizeof(ans)); for(int i=0;i<5;i++){ t=i; int vis[305]; priority_queue<node> Q; memset(vis,0,sizeof(vis)); while(t<maxn){ for(int j=0;j<n;j++) if(nod[j].b<=t&&nod[j].e>t&&!vis[j]) { Q.push(nod[j]); vis[j]=1; } int ok=0; while(!ok&&!Q.empty()){ node now=Q.top(); Q.pop(); if(now.b<=t&&now.e>t) { ans[i]++; ok=1; } } t+=5; } } int an; an=ans[0]; for(int i=0;i<5;i++) an=max(an,ans[i]); printf("%d\n",an); } return 0; }
相关文章推荐
- Selecting courses HDU - 3697 贪心 思维
- HDU 3697--贪心+暴力
- HDU 5360 Hiking (贪心+优先队列)
- HDU 3697 Selecting courses 选课(贪心)
- hdu 4544 湫湫系列故事——消灭兔子(优先队列+贪心)
- 简单贪心-hdu-3697-Selecting courses
- hdu 3697 贪心
- hdu 4544 湫湫系列故事——消灭兔子 优先队列+贪心
- hdu 5835 Danganronpa(贪心,优先队列)
- hdu 4544 优先队列+贪心
- HDU 2850 Load Balancing (贪心+优先队列)
- hdu 1789 贪心 优先队列
- HDU 3697 Selecting courses (贪心)
- HDU 5360 Hiking (贪心+优先队列)
- HDU 4544 湫湫系列故事——消灭兔子(优先队列+贪心)
- hdu 5360 Hiking (贪心+优先队列)
- HDU 3697贪心
- HDU 3697 Selecting courses (贪心)
- H - Selecting courses HDU - 3697 (暴力,枚举,贪心)
- HDU - 6047 多校2 1003 Maximum Sequence (贪心+优先队列)