选择有限时间内最多的活动数 贪心

简介: 选择有限时间内最多的活动数 贪心

题目:


有n个需要在同一天使用同一个教室的活动a1,a2,…,an,教室同一时刻只能由一个活动使用。
每个活动ai都有一个开始时间si和结束时间fi 。一旦被选择后,活动ai就占据半开时间区间[si,fi)。
如果[si,fi]和[sj,fj]互不重叠,ai和aj两个活动就可以被安排在这一天。
该问题就是要安排这些活动使得尽量多的活动能不冲突的举行。
例如下图所示的活动集合S,其中各项活动按照结束时间单调递增排序。


这道题用贪心策略来求解

1.首先将n个活动的开始时间与结束的时间都放在一个结构体中,并且为这个结构体根据每个活动的结束时间进行升序排序

2.此时第一个最早结束的为第一个活动,之后第二个活动开始进行遍历用其开始时间与之前的结束时间进行比较,若是大于等于之前的结束时间,那么就会将这个活动计算在内,此时下一个比较的就是这个新的活动的结束时间

3.最后得出有限时间内最多参加活动的数量


简而言之就是根据结束时间排序,然后从第二个开始不断与最近活动的结束时间进行比较,若是符合就加入活动数中


#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
int n;  //输入活动的总数 
struct Act{
  int start;
  int end;
}act[10000];
bool cmp(Act x,Act y){
  return x.end<y.end;
}
//求出对应时间内可以做的最多事情 
int greed_activity(){
  int num=1,i=1;0
  //默认从第二件开始,之前已经按照最早的结束时间排序过了
  for(int j=2;j<=n;j++){
  if(act[j].start>=act[i].end){
    i=j;
    num++;
  }
  } 
  return num;
}
void print(Act x)
{
  cout<<"stat:"<<x.start<<" end:"<<x.end<<endl;
}
int main()
{
  scanf("%d",&n);
  for(int i=1;i<=n;i++){
  scanf("%d%d",&act[i].start,&act[i].end);
  }
  act[0].start=-1;
  act[0].end = -1;
  sort(act+1,act+n+1,cmp);   //按照活动的最晚结束时间进行排序
  //for_each(act+1,act+n+1,print);   遍历算法调用库中进行检验
  int num = greed_activity();    
  cout<<num;
  return 0;
}
相关文章
|
6月前
|
JavaScript 测试技术
【动态规划】【精度】1883. 准时抵达会议现场的最小跳过休息次数
【动态规划】【精度】1883. 准时抵达会议现场的最小跳过休息次数
|
6月前
|
算法 测试技术 C#
【贪心算法】LeetCode2071:你可以安排的最多任务数目
【贪心算法】LeetCode2071:你可以安排的最多任务数目
【Leetcode -746.使用最小花费爬楼梯 -747.至少是其他数字两倍的最大数】
【Leetcode -746.使用最小花费爬楼梯 -747.至少是其他数字两倍的最大数】
71 0
【动态规划刷题 4】礼物的最大价值&&下降路径最小和
【动态规划刷题 4】礼物的最大价值&&下降路径最小和
03_使用最小花费爬楼梯
03_使用最小花费爬楼梯
|
6月前
|
算法
KPM算法求字符串的最小周期证明
公式 `ans = n - LPS[n-1]` 描述了最小周期,其中 `n` 是子串长度,`LPS[n-1]` 是前缀函数值。证明分为特殊情况和一般情况:对于完整周期字符串,`LPS[n-1] = 3*T`,故 `ans = T`;对于非完整周期,通过分析不同长度的 `[末部分]` 和 `[前部分]`,展示 `ans` 始终等于周期 `T` 或由 `[e][b]` 构成的最小周期,从而证明公式正确。
|
6月前
特别数的和(蓝桥杯)
特别数的和(蓝桥杯)
|
6月前
leetcode代码记录(使用最小花费爬楼梯
leetcode代码记录(使用最小花费爬楼梯
36 0
Leecode1124表现良好的最长时间段
Leecode1124表现良好的最长时间段
43 0
|
算法 C++ Python
【每日算法Day 90】5种方法:求解数组中出现次数超过一半的那个数
【每日算法Day 90】5种方法:求解数组中出现次数超过一半的那个数
171 0