贪心策略设计并解决会场安排问题

简介: 贪心策略设计并解决会场安排问题

问题描述


设有n个会议的集合C={1,2,…,n},其中每个会议都要求使用同一个资源(如会议室),而在同一时间内只能有一个会议使用该资源。每个会议i都有要求使用该资源的起始时间bi和结束时间ei,且bi < ei 。如果选择了会议i使用会议室,则它在半开区间[bi, ei)内占用该资源。如果[bi, ei)与[bj , ej)不相交,则称会议i与会议j是相容的。会场安排问题要求在所给的会议集合中选出最大的相容活动子集,也即尽可能地选择更多的会议来使用资源。


贪心策略


1、选择最早开始时间且不与已安排会议重叠的会议


2、选择使用时间最短且不与已安排会议重叠的会议


3、选择具有最早结束时间且不与已安排会议重叠的会议


这里我选取第三种方法


算法设计


设有11个会议等待安排,用贪心法找出满足目标要求的会议集合。这些会议按结束时间的非减序排列如表所示


11个会议按结束时间的非减序排列表:



代码实现


#include <iostream>
#include "会场安排.h"
#define n 11
struct meeting{
  int B;//开始时间
  int E;//结束时间
};
using namespace std;
int main()
{
  meeting M[n] = { {8,11}, {8,12}, {2,13}, {12,14}, {1,4},
             {3,5}, {0,6}, {5,7}, {3,8}, {5,9}, {6,10} };
  for(int i=0;i<n;i++)
  for(int j=0;j<n-i-1;j++)
    if (M[j].E > M[j + 1].E) {
    meeting T;
    T = M[j]; M[j]= M[j+ 1]; M[j+1]= T;
    }
  int allowedTime = 0;
  for (int i = 0,j=0; i < n; i++) {
  if (M[i].B > allowedTime) {
    j++;
    cout << "安排的第"<<j<<"个会议号是 " << i+1 <<" 此会议开始时间为:" << M[i].B 
    <<" 此会议结束时间是:" << M[i].E << endl;
    allowedTime = M[i].E;
  }
  }
}


选择结构体


定义meeting结构体,只设置会议开始时间B和结束时间E即可。

随机输入会议


n 为11


meeting M[n] = { {8,11}, {8,12}, {2,13}, {12,14}, {1,4},

                  {3,5}, {0,6}, {5,7}, {3,8}, {5,9}, {6,10} };


按结束时间排序


冒泡排序实现即可:


for(int i=0;i<n;i++)
        for(int j=0;j<n-i-1;j++)
            if (M[j].E > M[j + 1].E)
            {
                meeting T;
                T = M[j]; M[j]= M[j+ 1]; M[j+1]= T;
            }


这里的中间变量必须设置为 meeting 类型,以便于将会议的所有属性都交换


最终会议确定


int allowedTime = 0;
    for (int i = 0,j=0; i < n; i++) {
        if (M[i].B > allowedTime) {
            j++;
            cout << "安排的第"<<j<<"个会议号是 " << i+1 <<" 此会议开始时间为:" << M[i].B 
                <<" 此会议结束时间是:" << M[i].E << endl;
            allowedTime = M[i].E;
        }
    }


先将会议开始时间设置为0,只要把按结束时间升序排列的第一个大于0的开始时间加到第一个内容哦即可,随后将第一个会议的结束时间设置为allowedTime,产生下一个不与第一个会议时间冲突的会议;然后自己加点输出语句,美观的运行出来结果就好了。


相关文章
|
2月前
|
芯片 Python
前道设计
前道设计
22 3
|
9月前
|
数据可视化 数据处理
结构化分析与设计
一、结构化分析与设计 结构化分析与设计(Structured Analysis and Design,简称SAD)是一种软件开发方法论,旨在通过分析和设计来构建高质量的软件系统。 结构化分析与设计的主要特点包括以下几点: 1. 结构化分析:结构化分析是通过对系统需求进行分析,将系统分解为若干个功能模块,并定义它们之间的关系和交互。在结构化分析中,常用的工具和技术包括数据流图(Data Flow Diagram,简称DFD)、数据字典(Data Dictionary)和实体关系图(Entity-Relationship Diagram,简称ERD)等。 2. 结构化设计:结构化设计是在结构化分析
538 2
|
10月前
|
XML 存储 安全
深入理解HttpSecurity的设计
介绍了基于配置文件的使用方式以及实现细节,如下:
56 0
|
2月前
|
存储 SQL 前端开发
分类目录功能模型设计
分类目录功能模型设计
|
设计模式 架构师 Java
聊聊简单设计
聊聊简单设计
102 0
|
Java Scala
深入理解简单设计
深入理解简单设计
深入理解简单设计
|
安全 NoSQL JavaScript
C/C++为什么要专门设计个do…while?
最初do ... while的出现,更多的是作为循环控制流的一种语法糖。因为不论是while 还是 for循环,都是要先判断是否满足进入循环体的条件的。满足条件之后才能进入循环去执行循环体内的操作。
160 0
C/C++为什么要专门设计个do…while?
|
存储 消息中间件 算法
服务设计要解决的问题
 前几天和同事聊天,同事说:   “业务的服务(相对于我们基础架构这边的底层技术)在技术上就需要解决三个问题:分布式、通信和存储。”   我回忆之前做业务的时光,觉得确实,再加上一个“服务治理”就差不多了。想想“服务设计要解决的问题”这个话题可以把之前静儿写的很多文章做一个归纳概括。今天做一个总结。
服务设计要解决的问题