16.1-4

2024-02-27 07:48
文章标签 16.1

本文主要是介绍16.1-4,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

  问题的描述

有n个活动,对于其中的每个活动Ai均有一个开始时间Si和结束时间Fi表示该活动的举办时间是[Si, Fi), 其中0 <= Si < Fi < MAX。现在我们希望使用尽可能少的教室来调度所有的活动。注意每个活动在其举办时间内都独占公共的资源(比如教室等),所以一个教室同一时间只能有一个活动。

      为了与活动选择问题区别,我们将该问题成为活动全选择问题。

      等价的描述一:活动全选择问题模型可以转化成一个区间图,其顶点为活动,如果两个活动不兼容则在其对应的顶点上连一条边。为使任两个相邻结点的颜色互不相同,所需的最少颜色数对应于找出调度给定的所有活动所需的最少教室数。这个问题就是经典的区间图着色问题(interval-graph-coloring-problem)。

      等价的描述二:n条线段,每条线段都有起点S和终点F。现在将这n条线段分为尽量少的组,且每组的线段段互不重叠。求这个组数。

      解题算法

 O(n^2)解法:
  按e[i]进行排序,然后按CLRS16.1节所用的greedy algorithm每次选取最多活动给一个活动地点,即首先调用这个函数,得到可以兼容的最大活动数,然后再在余下的活动中再次调用这个函数,直至活动为0
    排序O(n*logn);
    每次greedy algorithm O(n),最坏情况下会使用n次greddy algorithm, O(n^2);
  故总的时间复杂度O(n^2).

O(n*logn)解法:
 

1.对于所有活动的时间点按升序进行排序(n个活动,就有2n个时间点),记录每个时间是起始的还是终止的,在排序的时候,对于值相同的时间点,如果是终止时间点的话,就排在前面。
2.最开始,选择第一个起始时间点,把它对应的活动放入一个教室,同时记录这个起始时间点对应的终止时间点。
3.接着按序选择第i个起始时间点(只选择起始时间点),对于第i个起始时间点,比较它和已有教室中的活动的终止时间点,若大于某个终止时间点,则直接将第i个起始时间点对应的活动放进相应的教室,否则新开辟一个教室来放入这个活动。 见代码清单-2

对于区间图着色(interval-graph coloring)问题,先在一个集合中放入一个点,然后把不与这个点相邻的所有元素放入这个集合,对于剩下的点,重复前面的动作即可,依此循环,直至没有点可选。最后,有多少个集合就是多少种颜色,集合中的元素用相同的色渲染。

#include <stdio.h>
#include <stdlib.h>


//每个时间点;是起始时间,还是终止时间;及其对应的结束时间
typedef struct point_t
{
  int time;
  int is_start;
  int end_time;//若is_start为1,end_time写对应的时间;若is_start为0,end_time为-1
} point;


//升序排列,若时间相同,则为终止时间的时间点排在前面
int compare(const void* a, const void* b)
{
  if ((*(point*)a).time != (*(point*)b).time)
    return (*(point*)a).time > (*(point*)b).time;
  else 
    return (*(point*)a).is_start < (*(point*)b).is_start;//这里得用小于
}


void process(point* points, const int n)
{
  //排序
  qsort(points, n, sizeof(point), compare);
  //最多n/2个教室
  int classrooms[n/2];
  int count = 0;
  classrooms[count++] = points[0].end_time;
  printf("[%d, %d)在教室%d\n", points[0].time, points[0].end_time, count);
  int i;
  int j;
  for (i = 1; i < n; i++)
  {
    if (points[i].is_start == 1)
    {
      for (j = 0; j < count; j++)
      {
    if (classrooms[j] <= points[i].time)
    {
      classrooms[j] = points[i].end_time;
      printf("[%d, %d)在教室%d\n", points[i].time, points[i].end_time, j+1);
      break;
    }
      }
      if (j == count)
      {
    classrooms[count++] = points[i].end_time;
    printf("[%d, %d)在教室%d\n", points[i].time, points[i].end_time, count);
      }
    }
  }
  printf("总共需要%d个教室.\n", count);
}



int main()
{
  int rows;
  scanf("%d", &rows);
  //2*rows个点
  point* points = (point*)malloc(2*rows*sizeof(point));
  //point p;
  int n = rows;
  //point p;
  int start_time;
  int end_time;
  while (rows--)
  {
    int id = n - rows - 1;
    scanf("%d%d", &start_time, &end_time);
    point p1;
    p1.is_start = 1;
    p1.time = start_time;
    p1.end_time = end_time;
    points[2*id] = p1;    
    
    point p2;
    p2.is_start = 0;
    p2.time = end_time;
    p2.end_time = -1;
    points[2*id + 1] = p2;
  }
  process(points, 2*n);
  free(points);
  return 0;
}
   

这篇关于16.1-4的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/751697

相关文章

算法导论第16章练习题 16.1-4

16.1-4 假设有一组活动,我们需要将它们安排到一些教室,任意活动都可以在任意教室进行。我们希望使用最少的教室来完成活动。设计一个高效的贪心算法,求每个活动应该在哪个教室来进行。   (这个问题也被称为区间图着色问题。我们可以作出一个区间图,其顶点为已知的活动,其边连接着不兼容的活动。要求使用最少的颜色对顶点进行着色,使得所有相邻顶点颜色均不相同——这与使用最少的教室完成所有的活动的问题是对应

16.1 调试-日志、打印数据

1. 日志 日志是指程序执行过程中记录的信息。 日志并非专为报告BUG而设,但可作为BUG发生时诊断故障的基础设施。日志通常采用文本文件的形式,便于直接阅读,以查找特定的事件或发生错误的原因 标准库的log包让应用程序能够将日志写入终端或文件 日志中包含日期、时间和文本等 log.Printf("This is a log message")2018/12/28 23:46:13 T

MySQL 5.7 详细安装教程以及Navicat 16.1安装教程,一篇搞定数据库

官网下载安装包         MySQL :: Download MySQL Installer(下载地址)         如下图所示,打开链接 默认选中的是8.0.33版本,我们点击一下红色箭头所指的英文进行切换即可。           版本切换为5.7.42,然后根据自己电脑的配置下载压缩包,我下载的是第二个64位的。            然后点击箭头指向的按钮,

16.1 Spring框架_AOP面向切面编程(❤❤❤❤)

16.1 Spring框架_AOP面向切面编程 1. AOP介绍及相关概念名词1.1 需求分析1.2 简介 2. AOP开发与配置流程2.1 入门实战_基于xml配置(❤❤)1. 依赖引入2. spring配置文件:基础格式3. 加载配置文件,启动Spring容器4. 定义切面:获取各层类信息5. 在applicationContext.xml配置切点和切面类 2.2 AOP关键概念1. a

16.1 Spring框架_SpringIoC容器与Bean管理(❤❤)

16.1 Spring框架_SpringIoC容器与Bean管理 1. Spring1.1 SpringIoC1. IoC控制反转2. DI依赖注入 1.2 Spring概念1. Spring含义2. 传统开发与SpringIoC开发模式比较 2. IoC基础实现案例(❤❤)1. 传统方式2. IoC与DI方式 3. bean管理:基于XML配置Bean(❤❤)3.1 基础配置3.2 be

双非本科准备秋招(16.1)—— 力扣二叉树

1、101. 对称二叉树         检查是否对称,其实就是检查左节点等不等于右节点,我们可以用递归来做。         如果左右节点都为null,说明肯定对称呀,返回true。         如果一个为null一个不为null,或者左右的值不相等,则为false。(这里简化一下,比如 left==null&&right!=null可以只写left==null,因为如果都为null

(个人实测保熟)记录Tecnomatix Process Simulate 16.1.2官方安装包及授权许可配置教程(Win10环境)

Tecnomatix Process Simulate 16是一款由西门子公司推出的一款工艺仿真解决方案,是虚拟制造仿真领域的领先解决方案,可帮助您数字化制造以及将创新思想和原材料转变为变革性产品的过程。在网上找了一些盗版的安装包,就很离谱。直接提示本"无法打开此安装程序包"。本文只是个人记录,不提供免费的远程指导,因为任何一个步骤出差错都会导致打不开软件。 完整教程 (个人实测保熟)记录Te

【流复制环境PostgreSQL-14.1到PostgreSQL-16.1大版本升级】

PostgreSQL大版本会定期添加新特性,这些新特性通常会改变系统表的布局,但内部数据存储格式很少改变。pg_upgrade通过创建新的系统表和重用旧的用户数据文件来执行快速升级。 pg_upgrade升级主要有三种用法: 1、使用pg_upgrade拷贝升级。 2、使用pg_upgrade链接升级(带有- -link选项),- -link较快,但是启动新版本后修改了数据文件,再启动旧版本可能

算法导论第三版16.1-4 贪心算法(区间图着色问题)

将英文版的答案翻译过来的,互相交流学习,新手轻喷。 假定有一组活动,需要将它们安排到一些教室,任意活动可以使用任意的教室。希望利用最少的教室完成所有活动的安排。 设S是n个活动的集合 利用贪心算法从S中找到一个最大规模的相容集合S1,把他们安排到第一个教室,然后从S-S1中继续找一个最大相 容集合S2,安排到第二个教室。一直这样直到所有活动都被安排,最差需要O(n^2)的时间,