1461: 饥饿的牛 贪心 +优先队列

川长思鸟来 2024-02-19 19:46 118阅读 0赞

1461: 饥饿的牛

时间限制: 1 Sec 内存限制: 128 MB
提交: 25 解决: 14
您该题的状态:已完成
[提交][状态][讨论版]

题目描述

牛在饲料槽前排好了队。饲料槽依次用1到N(1<=N<=2000)编号。每天晚上,一头幸运的牛根据约翰的规则,吃其中一些槽里的饲料。

约翰提供B个区间的清单。一个区间是一对整数start-end,1<=start<=end<=N,表示一些连续的饲料槽,比如1-3,7-8,3-4等等。牛可以任意选择区间,但是牛选择的区间不能有重叠。

当然,牛希望自己能够吃得越多越好。给出一些区间,帮助这只牛找一些区间,使它能吃到最多的东西。

在上面的例子中,1-3和3-4是重叠的;聪明的牛选择{1-3,7-8},这样可以吃到5个槽里的东西。

输入

第一行,整数B(1<=B<=1000)

第2到B+1行,每行两个整数,表示一个区间,较小的端点在前面。

输出

仅一个整数,表示最多能吃到多少个槽里的食物。

样例输入

  1. <span style="color:black">3
  2. 1 3
  3. 7 8
  4. 3 4
  5. </span>

样例输出

  1. <span style="color:black">5
  2. </span>

优先队列对结构体进行排列,让末端点从小到大排列,在设置一个标志位,记录上一个区间的末端点,如果大于这个标志,则进行累加。不大于的话,扔掉。

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<algorithm>
  4. #include<queue>
  5. using namespace std;
  6. typedef struct
  7. {
  8. int former,later;
  9. }node;
  10. bool operator <(const node &a,const node &b)
  11. {
  12. return a.later>b.later;
  13. }
  14. int main()
  15. {
  16. priority_queue<node> q;
  17. node s[1001];
  18. int i,j,n;
  19. int sum=0,last=-1;
  20. cin>>n;
  21. for(i=0;i<n;i++)
  22. {
  23. cin>>s[i].former>>s[i].later;
  24. q.push(s[i]);
  25. }
  26. while(!q.empty())
  27. {
  28. node d=q.top();
  29. q.pop();
  30. if(d.former>last)
  31. {
  32. sum+=(d.later-d.former+1);
  33. last=d.later;
  34. }
  35. }
  36. cout<<sum<<endl;
  37. return 0;
  38. }

加油,ヾ(◍°∇°◍)ノ゙

发表评论

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

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

相关阅读

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

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

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

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