贪心法

会议安排问题

问题描述:

  • 假设有n个会议,1个会议室,其中每个会议都要求使用会议室,而在同一时间内只能有一个会议使用该会议室,每个会议都提供使用该会议室的起始时间和结束时间,如果某个会议使用了该会议室,则它在半开区间[开始时间,结束时间)占用该会议室,如何选择会议进行顺序确保资源的最大化利用?

贪心策略:

  • 选择开始时间最早且使用时间最短的会议
    会议结束时间=会议开始时间+使用资源时间即: 每次从剩下未安排的会议中选择具有最早结束时间不会与已安排的会议重叠的会议

java语言设计步骤

  • 1.每个会议都有自己的编号,开始时间和结束时间,可以构建一个会议类,然后创建会议类型的对象
  • 2.根据会议的结束时间的大小进行升序排列
    特殊情况1: 如果结束时间相同的话,按开始时间升序排列
    特殊情况2: 会议排序后的最后一个会议并不满足条件,需要记录满足条件的最后一个会议的下标
  • 3.从第一个会议开始,从左到右按顺序选择不会与已安排的会议重叠的会议

Java代码:

import java.util.Scanner;class Meet{private int Sign;//会议编号private int Start;//会议开始时间private int End;//会议结束时间//构造函数public Meet(int Sign,int Start,int End) {this.Sign = Sign;this.Start = Start;this.End = End;}//设置与返回public void setSign(int Sign) {this.Sign = Sign;}public int getSign() {return Sign;}public void setStart(int Start) {this.Start = Start;}public int getStart() {return Start;}public void setEnd(int End) {this.End = End;}public int getEnd() {return End;}
}class MeetArrangeApp{private int count;//数组大小private Meet[] Meeting;//会议类型的数组Scanner scanner = new Scanner(System.in);//输入流//构造函数public MeetArrangeApp(int count) {   this.count = count;Meeting = new Meet[count];}//添加会议public void Add() {for(int i = 0;i < count;i++) {System.out.println("请输入会议" + (i+1) + "的会议编号,开始时间和结束时间:");Meeting[i] = new Meet(scanner.nextInt(),scanner.nextInt(),scanner.nextInt());}}//展示添加的会议public void displayMeet() {System.out.print("会议编号:");for(int i = 0;i < count;i++) {System.out.print(Meeting[i].getSign() + "   ");}System.out.println("");System.out.print("开始时间:");for(int i = 0;i < count;i++) {System.out.print(Meeting[i].getStart() + "   ");}System.out.println("");System.out.print("结束时间:");for(int i = 0;i < count;i++) {System.out.print(Meeting[i].getEnd()+ "   ");}System.out.println("");}//贪心策略public void selectMeet() {int out,in,min;//首先给会议按结束时间排序,使用选择排序;可以优化,选择其他排序方式for(out = 0; out < count - 1;out++) {min = out;for(in = out + 1;in < count;in++) {if(Meeting[in].getEnd() < Meeting[min].getEnd()) {min = in;}}swap(out,min);}//特殊情况:结束时间相等,但是前一个开始时间比后一个开始时间大,按照开始时间重新升序排列for(int i = 0;i < count - 1;i++) {if(Meeting[i].getEnd() == Meeting[i+1].getEnd() && Meeting[i].getStart() > Meeting[i+1].getStart()) {swap(i,i+1);}}}//交换数据public void swap(int one,int two) {Meet temp;temp = Meeting[one];Meeting[one] = Meeting[two];Meeting[two] = temp;   }//选择会议public void findMeet() {System.out.println("选择第" + Meeting[0].getSign() + "号会议");int out = 0;int in = 0;//特殊情况:排序后会议的最后一个会议并不满足条件,需要记录满足条件的最后一个会议的下标int record = 1;for(out = 0;out < count - 1;out++) {for(in = out + 1;in < count;in++) {if(Meeting[out].getEnd() <= Meeting[in].getStart()) {record++;System.out.println("选择第" + Meeting[in].getSign() + "号会议");out = in;}}}System.out.println("结束时间Last = " + Meeting[record].getEnd());}}
public class MeetArrange {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);int count;System.out.println("请输入需要安排的会议的个数:");count = scanner.nextInt();MeetArrangeApp maa = new MeetArrangeApp(count);maa.Add();maa.displayMeet();System.out.println("--------------------------------//首先把会议按结束时间从小到大排序");maa.selectMeet();maa.displayMeet();System.out.println("--------------------------------//然后根据贪心法选择会议");maa.findMeet();scanner.close();}
}

C++语言设计步骤

  • 1.初始化,将n个会议的开始时间存储在数组B中;将n个会议的结束时间存储在数组E中且按照结束时间的非减序排序,数组B需要做相应调整; 采用集合A来存储问题的解,如果会议i在集合A中,当且仅当A[i]= true。
    2.根据贪心策略,算法首先选择会议1,即令A[1]= true。依次扫描每一个会议,如果会议i的开始时间不小于最后一个选入集合A中的会议的结束时间,即会议i与A中会议相容,则将会议i加入集合A中;否则,放弃会议i,继续检查下一个会议与集合A中会议的相容性

C++代码:

核心代码:
void GreedySelector(){E中元素按非减序排列,B中对应元素做相应调整;int i,j;//初始化选择会议的集合A, 即只包含会议1A[1] = true;j = 1;i=2;//从会议i开始寻找与会议j相容的会议while(i <= n){//会议i的开始时间不小于最后一个选入集合A中的会议的结束时间if(B[i] >= E){//将会议i加入集合A中A[i] = true;j = i;}else{A[i] = false;}}
}

算法分析:
该算法的时间主要消耗在将各个会议按束时间从小到大进行排序的操作

  • 时间复杂度: 若采用快速排序算法进行排序,算法的时间复杂性O(nlogn)。也可以采用其他方法
  • 空间复杂度: 该算法的空间复杂性是常数阶,即S(n)= 0(1)。

贪心法--->1.会议安排问题相关推荐

  1. java活动安排_贪心法求解活动安排(java实现)

    贪心法描述: 贪心算法总是作出在当前看来最好的选择.也就是说贪心算法并不从整体最优考虑,它所作出的选择只是在某种意义上的局部最优选择. 在一些情况下,即使贪心算法不能得到整体最优解,其最终结果却是最优 ...

  2. 12贪心法——活动安排相容问题

    12基于贪心法的活动安排相容问题 目录 12基于贪心法的活动安排相容问题 简述贪心法 1.问题 2.解析 举个栗子 贪心策略1--按结束时间从小到大选择活动 贪心策略2--按开始时间从小到大选择活动 ...

  3. 【算法分析】实验 1. 基于贪心的会议安排问题

    目录 实验内容 实验目的 环境要求 实验结果 步骤一 步骤二 步骤三 步骤四 步骤五 步骤六 实验总结 附录:测试数据 实验内容 本实验要求基于算法设计与分析的一般过程(即待求解问题的描述.算法设计. ...

  4. 贪心算法之高级钟点秘书会议安排问题

    1.问题 所谓"钟点秘书",是指年轻白领女性利用工余时间为客户提供秘书服务,并按钟点收取酬金."钟点秘书"为客户提供有偿服务的方式一般是:采用电话.电传.上网等 ...

  5. 贪心法——活动安排问题

    贪心法--活动安排问题 贪心法 贪心法的本质可以认为是动态规划在特定条件下的优化.贪心法满足两个性质,最优子结构性质和贪心选择性质. 满足最优子结构性质意味着问题可以被层层分解为子问题,这些子问题构成 ...

  6. 【贪心法】基站布置问题

    问题描述: 海面上有一些船需要与陆地进行通信,需要在海岸线上布置一些基站.现将问题抽象为,在x轴上方,给出n条船的坐标 p1,p2,-,pnp_1, p_2, -, p_np1​,p2​,-,pn​, ...

  7. 算法笔记(0002) - 【贪心算法】活动安排问题

    贪心算法 原理 在对问题求解时,总是做出在当前看来是最好的选择.也就是说,不从整体最优上加以考虑,他所做出的仅是在某种意义上的局部最优解.贪心算法不是对所有问题都能得到整体最优解,但对范围相当广泛的许 ...

  8. 基于贪心算法的活动安排问题

    一.问题的描述 学校的小礼堂每天都会有许多活动,有时间这些活动的计划时间会发生冲突,需要选择出一些活动进行举办.小刘的工作就是安排学校小礼堂的活动,每个时间最多安排一个活动. 现在小刘有一些活动计划的 ...

  9. 会议安排问题JAVA实现

    本人菜鸟一枚,刚开始做这个题也没有思路,参考了别人的思路,最终完成了这道题. 我将关于本问题的思路都写在代码中了,欢迎大家指出问题. package com.zhou.algorithm;import ...

  10. 算法分析与设计(第四章 贪心法(局部最优))

    1.基本思想:贪心法通过分步决策的方法求解问题.贪心法每一步用作决策依据的选择准则称为最优量度标准(局部最优解).在根据最优量度标准选择分量的过程中,还需要使用一个可行解判定函数(约束条件). 2.贪 ...

最新文章

  1. PHP中的随机性——你觉得自己幸运吗?
  2. 用我对HTML的点点理解来做个简单的百度首页
  3. Java ThreadLocal
  4. android修改自动背光,Android LCD和键盘 背光亮度设置
  5. 多叉树的前序遍历_多叉树的创建和遍历(为Trie树做准备)
  6. mysql 分组group
  7. 【画图专题】sns.heatmap的用法简介
  8. 机械师电脑_必看!面对电脑玩游戏卡顿,需要做些什么?
  9. 百度文库f12免费复制文章
  10. git diffmerge合并
  11. php 传真机 原理,三洋SFX-11B传真机简单拆解
  12. 报价单,要这样做才专业
  13. Digispark ATtiny85配合Prismatik软件DIY屏幕流光溢彩效果(见坑填坑)
  14. 全球及中国代餐轻食市场发展现状与消费需求前景调研报告2022版
  15. 腾讯云TCA运维认证考试题库
  16. 支持小米java文件阅读器_小米多看电纸书MiReader 桌面LauncherApp(自制软件)
  17. 【目标跟踪】|stark配置 win otb
  18. 前端后端数据交换乱码问题
  19. 3d游戏建模行业发展前景和待遇怎么样?学习的渠道有哪些
  20. 锁机制:读者写者问题 Linux C

热门文章

  1. HDDREG(硬盘坏道修复工具)v1.31绿色版
  2. 两台电脑实现串口通信
  3. 关于用数组实现输入字符串以单词为元素反转输出思路
  4. 【程序设计基础与实验】地铁售票查询系统
  5. html5考试总结300字,期中考试总结
  6. 上海计算机在职专业硕士学校,专业硕士计算机类可以报考上海哪些学校?
  7. 桥本分数式(用递归法实现全排列)
  8. php 模板 {{}},PHP模板技术
  9. 机器学习(二)简单逻辑回归python算法+代码(实例:体检阳性阴性预测患不患病)
  10. oracle卸载ogg,Oracle GoldenGate(ogg)安装经验大汇总,采坑总结,绝对干货!