贪心算法-活动安排问题

活动安排问题

  • 问题描述

    有n个需要使用同一资源的活动,且在同一时段只有一个活动能使用该资源。
    每个活动i都有一个起始时间 si 和结束时间 fi ,且 si < ei 。如果选择了活动 i,则它在半开时间区间 [si,ei) 内占用资源。若区间 [si, ei) 与区间 [sj,ej) 不相交,则称活动 i 与活动 j 是相容的。
    该问题就是要安排这些活动使得尽量多的活动能不冲突地举行。
    归纳: 活动安排问题就是要在所给的活动集合中选出最大的相容活动子集合。

  • 解题思路

    每次总是选择具有最早完成时间的活动,为未安排活动留下尽可能多的时间。该算法的贪心选择的意义是使剩余的可安排时间段极大化,以便安排尽可能多的相容活动。
    贪心算法 是指在对问题求解时,不从整体最优上加以考虑,总是做出某种意义上的局部最优解。)

  • 解题步骤

    1.将各项活动按照结束时间单调递增排序;
    2.每次选择具有最早完成时间的活动,并计数。

  • 实例

兼容问题

设有 n 个任务,其中每个任务有一个起始时间 si 和一个结束时间 ei ,且 si < ei ,同一时间只能完成一个任务。如果选择了任务 i ,则它在时间区间 [si ,ei) 内占用资源。若区间 [si,ei) 与区间 [sj, ej)不相交,则称任务 i 与任务 j 是相容的。
那么,对于给定的任务时间区间,能互相兼容的最大任务个数是多少呢?

输入格式:

第一行一个整数 n (1<=n<=1000);
接下来 n 行,每行两个整数 si 和 ei 。

输出格式:

互相兼容的最大任务个数。

输入:

4
1 3
4 6
2 5
1 7

输出:

2

  • 完整代码
#include<stdio.h>

int main(){
   int n,i,j,number=1,t,final;
   int s[1200],e[1200];
   scanf("%d",&n);
   for(i=0;i<n;i++){
       scanf("%d%d",&s[i],&e[i]);
   }
   for(i=0;i<n-1;i++){
       for(j=0;j<n-i-1;j++){
           if(e[j]>e[j+1]){
               t=s[j];
               s[j]=s[j+1];
               s[j+1]=t;
               t=e[j];
               e[j]=e[j+1];
               e[j+1]=t;
           }
       }
   }
   final=e[0];
   for(i=1;i<n;i++){
       if(s[i]>=final){
           number++;
           final=e[i];
       }
   }
   printf("%d",number);
   return 0;
}

参考资料:从零开始学贪心算法

原文地址:https://www.cnblogs.com/dump16/p/12359553.html

时间: 2024-11-03 20:51:05

贪心算法-活动安排问题的相关文章

算法设计与分析(三)贪心算法--活动安排问题

活动安排问题https://blog.csdn.net/qq_40452317/article/details/88875384 贪心算法汇总--喷水装置问题.会场安排问题.过河问题https://blog.csdn.net/liujiuxiaoshitou/article/details/69728714 原文地址:https://www.cnblogs.com/yasheng/p/12517250.html

贪心算法--活动安排

1 package cn.it; 2 3 import java.util.Arrays; 4 5 public class Tx { 6 public static void main(String[] args) { 7 int start[]={1,4,2,1,2,4,5}; 8 int end[]={5,6,3,2,4,5,6}; 9 int n=6; 10 boolean a[]= new boolean[n]; 11 sort(start,end,n); 12 int count =

hdu2037今年暑假不AC(贪心,活动安排问题)

今年暑假不AC Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other) Total Submission(s) : 15   Accepted Submission(s) : 13 Font: Times New Roman | Verdana | Georgia Font Size: ← → Problem Description “今年暑假不AC?”“是的.”“那你干什么呢?”“看世界杯

[贪心入门]活动安排问题之二

有若干个活动,第i个开始时间和结束时间是[Si,fi),活动之间不能交叠,要把活动都安排完,至少需要几个教室? 分析:能否按照之一问题的解法,每个教室安排尽可能多的活动,即按结束时间排序,再贪心选择不冲突的活动,安排一个教室之后,剩余的活动再分配一个教室,继续贪心选择…… 反例: A:[1,2)  B:[1,4) C:[5,6) D:[3,7) 已经按结束时间排好顺序,我们会选择教室1: A C教室2:  B教室3:  D需要3个教室.但是如果换一种安排方法,我们可以安排AD在一个教室,而BC在

贪心入门——活动安排问题

贪心入门的几个例题来自51nod 问题描述 有若干个活动,第i个开始时间和结束时间是[Si,fi),只有一个教室,活动之间不能交叠,求最多安排多少个活动? 输入 第1行:1个数N,线段的数量(2 <= N <= 10000) 第2 - N + 1行:每行2个数,线段的起点和终点(-10^9 <= S,E <= 10^9) 输出 输出最多可以选择的线段数量. 输入示例 3 1 5 2 3 3 6 输出示例 2 求解思路 按照活动的结束时间早的优先 算法代码 #include <

[贪心入门]活动安排问题

有若干个活动,第i个开始时间和结束时间是[Si,fi),只有一个教室,活动之间不能交叠,求最多安排多少个活动? 分析: 我们就是想提高教室地利用率,尽可能多地安排活动.考虑容易想到的几种贪心策略: (1) 开始最早的活动优先,目标是想尽早结束活动,让出教室.然而, 这个显然不行,因为最早的活动可能很长,影响我们进行后面的活动.例如活动开始和结束时间分别为[0, 100), [1,2) ,[2, 3), [3, 4),[4,5],安排[0,100)的这个活动之后,其他活动无法安排,可是最优解是安排

贪心算法—活动选择问题

4.1 活动选择问题 1.问题的理解与描述 假定有n个需要使用同一个这样的资源的活动,每次只能有一个活动使用该资源.每一个活动有一个开始时间 si,一个完成时间 fi,其中0 ≤ si < fi < ∞.如果区间[si , fi)和[sj , fj)不相交,活动ai和aj是相容的(即如果si≥ fj 或 sj ≤ fi,ai和aj相容).活动选择问题是选取一个由相容活动构成的最大集合. 输入:按完成时间排好序的活动开始时间数组s,完成时间数组 f. 输出:表示一个最大的相容活动组的向量{x1,

区间图着色问题(贪心算法的解法)

问题描述:假设要用很多个教室对一组活动进行调度.我们希望使用尽可能少的教室来调度所有活动.请给出一个算法,来确定哪一个活动使用哪一间教室.这个问题也被称为区间图着色问题,即相容的活动着同色,不相容的着不同颜色,使得所用颜色数最少. 解法思想: 其实我们知道,对于单个教室我们可以用贪心算法进行求解,但是对于这个区间图的问题,我们采用的方法是多次的贪心.其实你想想看,你无非就是要使那些活动 全部被安排完吧,当然这样安排的方法很多,如何使得安排后的教室最小呢???? 这明显也是个贪心的问题.聪明的人很

贪心算法_活动安排问题_哈弗曼编码

问题表述:设有n个活动的集合E = {1,2,…,n},其中每个活动都要求使用同一资源,如演讲会场等,而在同一时间内只有一个活动能使用这一资源.每个活i都有一个要求使用该资源的起始时间si和一个结束时间fi,且si < fi .如果选择了活动i,则它在半开时间区间[si, fi)内占用资源.若区间[si, fi)与区间[sj, fj)不相交,则称活动i与活动j是相容的.也就是说,当si >= fj或sj >= fi时,活动i与活动j相容. 由于输入的活动以其完成时间的非减序排列,所以算法