51nod 1428 (贪心+优先队列)

本是古典 何须时尚 2022-07-26 05:28 296阅读 0赞

![Image 1][]有若干个活动,第i个开始时间和结束时间是[Si,fi),同一个教室安排的活动之间不能交叠,求要安排所有活动,最少需要几个教室?

Input

  1. 第一行一个正整数n (n <= 10000)代表活动的个数。
  2. 第二行到第(n + 1)行包含n个开始时间和结束时间。
  3. 开始时间严格小于结束时间,并且时间都是非负整数,小于1000000000

Output

  1. 一行包含一个整数表示最少教室的个数。

思路:发现好多贪心的题目都是用优先队列来解决的。。。。

着个题目实际上就是求很多区间当中最大的重叠部分的区间个数。就是因为想到这里以为是直接贪心,想了好久发现并没有什么好的方法去实现。然后看了一下之前写的贪心题目就想到了优先队列。 按照结束时间最小值优先的策略就可以很轻松的解决这个题目。

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <queue>
  4. #include <stack>
  5. #include <cstring>
  6. #include <algorithm>
  7. using namespace std;
  8. #define inf 1000000005
  9. #define LL long long
  10. int const maxn = 10005;
  11. struct node
  12. {
  13. LL s,e;//结束时间和奖励
  14. bool operator < (const node& u)const
  15. {
  16. return e>u.e ; //最小值优先
  17. }
  18. }A[maxn];
  19. bool cmp(node a,node b)
  20. {
  21. if(a.s!=b.s)return a.s<b.s;
  22. return a.e<b.e;
  23. }
  24. int main()
  25. {
  26. int n;
  27. while(scanf("%d",&n)!=EOF)
  28. {
  29. for(int i = 0 ; i < n ; i++)
  30. {
  31. scanf("%I64d%I64d",&A[i].s,&A[i].e);
  32. }
  33. sort(A,A+n,cmp);
  34. int ans = 1 ;
  35. priority_queue<node> q;
  36. while(!q.empty())q.pop();
  37. q.push(A[0]);
  38. for(int i = 1 ; i < n ; i++)
  39. {
  40. node temp = q.top();
  41. q.pop();
  42. if(A[i].s<temp.e)
  43. {
  44. ans++;
  45. q.push(A[i]);
  46. q.push(temp);
  47. }
  48. else q.push(A[i]);
  49. }
  50. printf("%d\n",ans);
  51. }
  52. return 0;
  53. }

[Image 1]:

发表评论

表情:
评论列表 (有 0 条评论,296人围观)

还没有评论,来说两句吧...

相关阅读

    相关 51nod 1163 (贪心+优先队列

    有N个任务,每个任务有一个最晚结束时间以及一个对应的奖励。在结束时间之前完成该任务,就可以获得对应的奖励。完成每一个任务所需的时间都是1个单位时间。有时候完成所有任务是不可能的

    相关 51nod 1182(简单贪心

    约翰认为字符串的完美度等于它里面所有字母的完美度之和。每个字母的完美度可以由你来分配,不同字母的完美度不同,分别对应一个1-26之间的整数。 约翰不在乎字母大小写。(也就是说

    相关 51nod 1191(贪心+优先队列)

    有N只兔子,每只有一个血量B\[i\],需要用箭杀死免子。有M种不同类型的箭可以选择,每种箭对兔子的伤害值分别为D\[i\],价格为P\[i\](1 <= i <= M)。假设

    相关 51nod1099 贪心

    有N个任务需要执行,第i个任务计算时占R\[i\]个空间,而后会释放一部分,最后储存计算结果需要占据O\[i\]个空间(O\[i\] < R\[i\])。 例如:执行需要5个