忙碌的Nova君 (活动安排问题、贪心算法)

阅读: 评论:0

忙碌的Nova君 (活动安排问题、贪心算法)

忙碌的Nova君 (活动安排问题、贪心算法)

题目描述

理论上,Nova君是个大闲人,但每天还是有一大堆事要干,大作业啦,创新杯啦,游戏啦,出题坑人啦&#然而精力有限,Nova君同一时间只能做一件事,并不能一心二用。假设现在有N项工作等待Nova君完成,分别在 Si 时刻开始,在 Ti 时刻结束,对于每项工作可以选择做或者不做,但不可以同时选择时间重叠的工作(即使是开始的瞬间和结束的瞬间重叠也是不允许的)。Nova君自然希望尽量多做一些事情,那么最多能做几件事呢?

输入

多组测试数据(数据组数不超过10),对于每组数据,第一行输入一个正整数N,代表可选的工作数量,接下来输入N行,每行两个正整数,代表第 i 个工作的开始时间 si 和结束时间 ti 。

1<=N<=100000 | 1<=si<=ti<=10^9

输出

对于每组数据,输出一行,为可完成的工作的最大数量。

输入样例

5
1 3
2 5
4 7
6 9
8 10

输出样例

3
题目来源 :/contest/23/problem/E/index
解题思路:按照活动结束时间进行排序,先结束的排在前列,后结束的排在后面。
每次放入先结束的活动,将其的结束时间和下一个活动的开始时间进行比较,如果满足下一个活动在上个活动结束之后开始那么将该活动放入进来,依次进行操作,直到最后一个活动为止。输出结果为活动最多数目。
本题代码:
 1 #include <bits/stdc++.h>
 2 #define max_size 10010
 3 using namespace std;
 4 int order[max_size];
 5 
 6 struct node{
 7 int start,end;
 8 int id;
 9 };
10 
11 node act[max_size];
12 
13 bool cmp(node a,node b)
14 {
15     d&d;
16 };
17 
18 int main()
19 {
20     int n;
21     while(~scanf("%d",&n))
22     {
23         for(int i=0;i<n;i++)
24            {
25                scanf("%d%d",&act[i].start,&act[i].end);
26                 act[i].id=i+1;
27            }
28         sort(act,act+n,cmp);
29         order[0]=0;
30         int number=1;
31         for(int i=1;i<n;i++)
32         {
33             if(act[i].start>=act[order[number-1]].end)
34             order[number++]=i;
35         }
36         cout<<number<<endl;
37     }
38 }
在之前的博客文章讲解活动安排的区别点:
1、之前博客讲述了dp求活动安排问题,也讲述了使用贪心求解。但是之前的问题默认输入的活动已经按照活动结束时间进行了排序,现在这个题目并没有排序。
2、之前的活动可以是下一个活动的开始正好是上一个活动的结束,但是这道题目要求不能够有重合。
下面给出之前博客的链接:.html

转载于:.html

本文发布于:2024-01-28 11:23:25,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/17064122097077.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:贪心   算法   忙碌   Nova
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23