前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >会场安排问题

会场安排问题

作者头像
我没有三颗心脏
发布于 2018-04-26 08:08:36
发布于 2018-04-26 08:08:36
1.3K00
代码可运行
举报
文章被收录于专栏:Java WebJava Web
运行总次数:0
代码可运行

问题描述:

假设要在足够多的会场里安排一批活动,并希望使用尽可能少的会场。设计一个有效的贪心算法进行安排(这个问题实际上是著名的图着色问题。若将每一个活动作为图的一个顶点,不相容活动间用边相连。使相邻顶点着有不同颜色的最小着色数,相应于要找的最小会场数)。

来换一个描述

为了能够更加生动说明问题的整个过程,所以换一个类似的描述来契合《算法图解》一书中的描述。

你没法让这些课都在这间教室上,因为有些课的上课时间有冲突。

你希望这间教室上尽可能多的课。如何选出尽可能多且时间不冲突的课程呢?

这个问题似乎很难,但算法却简单得让人吃惊。具体做法如下:

  • ①选出结束最早的课,它就是要在这间教室上的第一堂课。
  • ②接下来,必须选择第一堂课结束后才开始的课。同样,你选择结束最早的课,这将是要在这间教室上的第二堂课。

重复这样做就能找出答案!下面来试一试。美术课的结束时间最早,为10:00 a.m,因此它就是第一堂课。

接下来的课必须在10:00 a.m后开始,且结束得最早。

英语课不行,因为它的时间与美术课冲突,但数学课满足条件。最后,计算机课与数学课的时间是冲突的,但音乐课可以。

因此将在这间教室上如下三堂课。

贪婪算法很简单:每步都采取最优的做法。在这个示例中,你每次都选择结束最早的课。用专业术语说,就是你每步都选择局部最优解,最终得到的就是全局最优解。听上去有些神奇,但对于这个调度问题上,上述的简单算法找到的就是最优解。

数据输入

第一行有1个正整数k,表示有k个待安排的活动。接下来的k行中,每行有两个正整数,分别表示k个待安排的活动开始时间和活动结束时间。时间以0点开始的分钟计。

由于问题定义上有些纰漏,但通常,我们认为如果上一个活动在t时间结束,下一个活动最早应该在t+1时间开始(上述问题有一定出入)

代码实现

考虑到用户输入并不会按照开始的时间或者结束的时间严格输入,所以我们自己或许要加一个排序算法,这对我们自己遍历也会提供方便:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
private static int meeting_problem(int[] startTime,int[] endTime){
    //一组活动数据的最优解
    int maxresult = 1;
    //冒泡排序,对startTime和endTime数据进行排序
    for (int i = 0; i < endTime.length-1; i++) {
        boolean canBreak = true;
        for (int j = 1; j < endTime.length - i; j++) {
            if (endTime[j-1] > endTime[j]) {
                int temp = endTime[j - 1];
                endTime[j-1] = endTime[j];
                endTime[j] = temp;

                int temp2 = startTime[j - 1];
                startTime[j-1] = startTime[j];
                startTime[j] = temp2;
                canBreak = false;
            }
        }
        if (canBreak) {
            break;
        }
    }
    // 记录上一次活动的结束时间
    int key = endTime[0];
    for (int i = 1; i < endTime.length; i++) {
        // 如果活动的开始时间能够大于上一次活动的结束时间
        if (startTime[i] - key >= 1){
            //计数+1
            maxresult ++;
            //保存结束时间
            key = endTime[i];
        }
    }
    return maxresult;
}

结合输入的代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);
    int num = scanner.nextInt();
    int[] results = new int[num];
    for (int i = 0; i < num; i++) {
        int a = scanner.nextInt();
        int[] startTimes = new int[a];
        int[] endTimes = new int[a];
        for (int j = 0; j < a; j++) {
            startTimes[j] = scanner.nextInt();
            endTimes[j] = scanner.nextInt();
        }
        results[i] = (meeting_problem(startTimes, endTimes));
    }
    for (Integer result:results) {
        System.out.println(result);
    }
}

这里直接引用了 黑白咖 的文章:http://www.jianshu.com/p/0ce92abe862d 中的代码。

另外一种思路

我们也可以通过找最大重叠数来完成,这里不符合贪心策略,所以就不作深入研究。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017.11.25 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
算法打卡40:会场安排问题
其实,就是求尽可能多的不相交的区间。将时间区间按照结束时间升序排列,如果结束时间相同,按开始时间降序排列。
好好学java
2018/09/21
4390
算法打卡40:会场安排问题
文心一言 VS 讯飞星火 VS chatgpt (213)-- 算法导论16.1 4题
四、假定有一组活动,我们需要将它们安排到一些教室,任意活动都可以在任意教室进行。我们希望使用最少的教室完成所有活动。设计一个高效的贪心算法求每个活动应该在哪个教室进行。(这个问题称为区间图着色问题(interval-graph color problem)。我们可以构造一个区间图,顶点表示给定的活动,边连接不兼容的活动。要求用最少的颜色对顶点进行着色,使得所有相邻顶点颜色均不相同——这与使用最少的教室完成所有活动的问题是对应的。)如果要写代码,请用go语言。
福大大架构师每日一题
2024/03/18
1290
文心一言 VS 讯飞星火 VS chatgpt (213)-- 算法导论16.1 4题
算法笔记(0002) - 【贪心算法】活动安排问题
在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的仅是在某种意义上的局部最优解。贪心算法不是对所有问题都能得到整体最优解,但对范围相当广泛的许多问题他能产生整体最优解或者是整体最优解的近似解。
量子态的沐子呓
2019/12/25
1.2K0
算法笔记(0002) - 【贪心算法】活动安排问题
算法系列之动态规划
动态规划(Dynamic Programming,简称DP)是一种用于解决复杂问题的算法设计技术。它通过将问题分解为更小的子问题,并存储这些子问题的解来避免重复计算,从而提高算法的效率。本文将介绍动态规划的基本概念、适用场景、复杂度分析,并通过Java代码实现经典的动态规划问题。
修己xj
2025/03/12
1560
算法系列之动态规划
文心一言 VS 讯飞星火 VS chatgpt (211)-- 算法导论16.1 2题
使用选择最晚开始活动的贪心策略来设计算法时,我们需要确保每一步都做出在当前状态下最优的选择,并且最终这些局部最优选择能够组成全局最优解。
福大大架构师每日一题
2024/03/18
1320
文心一言 VS 讯飞星火 VS chatgpt (211)-- 算法导论16.1 2题
贪婪算法回顾
贪婪算法回顾 回顾 还记的贪婪算法么? 如果你不记得了, 看了下面这个例子你一定会想起来, 因为这个例子太普遍了, 几乎每个将贪婪算法的地方, 第一个例子都是它, 言归正传. 问题: 现在有如下课程表
烟草的香味
2019/07/25
4050
CCF认证试题 2017-09-02 公共钥匙盒 ----Java实现
  有一个学校的老师共用N个教室,按照规定,所有的钥匙都必须放在公共钥匙盒里,老师不能带钥匙回家。每次老师上课前,都从公共钥匙盒里找到自己上课的教室的钥匙去开门,上完课后,再将钥匙放回到钥匙盒中。
vivi
2020/07/14
4260
文心一言 VS 讯飞星火 VS chatgpt (210)-- 算法导论16.1 1题
活动选择问题是一个典型的贪心算法问题,其目标是选择一组不重叠的活动,使得这些活动的总时间最长。动态规划也可以用来解决这个问题,但需要更多的存储空间来保存子问题的解。
福大大架构师每日一题
2024/03/18
1130
文心一言 VS 讯飞星火 VS chatgpt (210)-- 算法导论16.1 1题
活动安排问题--贪心算法
活动安排问题就是要在所给的活动集合中选出最大的相容活动子集合,是可以用贪心算法有效求解的很好例子。该问题要求高效地安排一系列争用某一公共资源的活动。贪心算法提供了一个简单、漂亮的方法使得尽可能多的活动能兼容地使用公共资源。   设有n个活动的集合E={1,2,…,n},其中每个活动都要求使用同一资源,如演讲会场等,而在同一时间内只有一个活动能使用这一资源。每个活动i都有一个要求使用该资源的起始时间si和一个结束时间fi,且si <fi 。如果选择了活动i,则它在半开时间区间[si, fi]内占用资源。若区
用户1154259
2018/01/17
2.8K0
网易校招真题二
题目描述 平面内有n个矩形, 第i个矩形的左下角坐标为(x1[i], y1[i]), 右上角坐标为(x2[i], y2[i])。
Tim在路上
2020/08/04
5660
算法系列之贪心算法
在算法中,贪心算法(Greedy Algorithm)是一种常见的解决优化问题的算法。贪心算法的核心思想是:在每一步选择中都采取当前状态下最优的选择,即贪心的做出局部最优的决策,从而希望最终能够得到全局最优解。尽管贪心算法并不总是能够得到全局最优解,但在许多实际问题中,它能够提供足够好的解决方案,并且具有较高的计算效率。
修己xj
2025/03/12
1130
算法系列之贪心算法
GREEDY ALGORITHMS
贪心算法(Greedy Algorithm)是一种常见的优化算法,用于解决一类最优化问题。在每一步选择中,贪心算法总是选择当前看起来最优的选择,而不考虑该选择会不会影响未来的选择。这种贪心选择的策略通常是局部最优的,但不一定是全局最优的。
Ywrby
2023/10/16
3710
GREEDY ALGORITHMS
图解LeetCode——1235. 规划兼职工作(难度:困难)
你打算利用空闲时间来做兼职工作赚些零花钱。 这里有 n 份兼职工作,每份工作预计从 startTime[i] 开始到 endTime[i] 结束,报酬为 profit[i]。 给你一份兼职工作表,包含开始时间 startTime,结束时间 endTime 和预计报酬 profit 三个数组,请你计算并返回可以获得的最大报酬。 注意,时间上出现重叠的 2 份工作不能同时进行。 如果你选择的工作在时间 X 结束,那么你可以立刻进行在时间 X 开始的下一份工作。
爪哇缪斯
2023/05/10
2630
图解LeetCode——1235. 规划兼职工作(难度:困难)
你听过算法也是可以贪心的吗?
贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的是在某种意义上的局部最优解。 贪心算法不是对所有问题都能得到整体最优解,关键是贪心策略的选择,选择的贪心策略必须具备无后效性,即某个状态以前的过程不会影响以后的状态,只与当前状态有关。 基本思路 1、建立数学模型来描述问题; 2、把求解的问题分成若干个子问题; 3、对每一子问题求解,得到子问题的局部最优解; 4、把子问题的解局部最优解合成原来解问题的一个解。 算法实现 1、从问题的某个初
用户1332428
2018/03/08
1.2K0
你听过算法也是可以贪心的吗?
贪心算法(Java)
顾名思义,贪心算法总是作出在当前看来最好的选择。也就是说贪心算法并不从整体最优考虑,它所作出的选择只是在某种意义上的局部最优选择。当然,希望贪心算法得到的最终结果也是整体最优的。虽然贪心算法不能对所有问题都得到整体最优解,但对许多问题它能产生整体最优解。如单源最短路径问题,最小生成树问题等。在一些情况下,即使贪心算法不能得到整体最优解,其最终结果却是最优解的很好近似。
WHYBIGDATA
2023/01/31
5640
贪心算法(Java)
公共钥匙盒-CSP数组排序练习
  有一个学校的老师共用N个教室,按照规定,所有的钥匙都必须放在公共钥匙盒里,老师不能带钥匙回家。每次老师上课前,都从公共钥匙盒里找到自己上课的教室的钥匙去开门,上完课后,再将钥匙放回到钥匙盒中。   钥匙盒一共有N个挂钩,从左到右排成一排,用来挂N个教室的钥匙。一串钥匙没有固定的悬挂位置,但钥匙上有标识,所以老师们不会弄混钥匙。   每次取钥匙的时候,老师们都会找到自己所需要的钥匙将其取走,而不会移动其他钥匙。每次还钥匙的时候,还钥匙的老师会找到最左边的空的挂钩,将钥匙挂在这个挂钩上。如果有多位老师还钥匙,则他们按钥匙编号从小到大的顺序还。如果同一时刻既有老师还钥匙又有老师取钥匙,则老师们会先将钥匙全还回去再取出。   今天开始的时候钥匙是按编号从小到大的顺序放在钥匙盒里的。有K位老师要上课,给出每位老师所需要的钥匙、开始上课的时间和上课的时长,假设下课时间就是还钥匙时间,请问最终钥匙盒里面钥匙的顺序是怎样的?
开心鸭
2020/10/26
4050
动态规划篇——背包问题
动态规划篇——背包问题 本次我们介绍动态规划篇的背包问题,我们会从下面几个角度来介绍: 背包问题概述 零一背包问题 完全背包问题 多重背包问题 分组背包问题 背包问题概述 背包问题算是很经典的动态规划问题,我们在面试中也经常出现 首先我们给出动态规划的思想: 然后我们简单介绍一下背包问题: /*背包问题*/ 有 N 件物品和一个容量是 V 的背包。 第 i 件物品的体积是 vi,价值是 wi。 求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大,输出最大价值。 /*输入格式
秋落雨微凉
2022/11/28
5310
动态规划篇——背包问题
深入字节码 -- 计算方法执行时间 原
java程序通过javac编译之后生成文件.class就是字节码集合,正是有这样一种中间码(字节码),使得scala/groovy/clojure等函数语言只用实现一个编译器即可运行在JVM上。 看看一段简单代码。
九州暮云
2019/08/21
1.2K1
天天肝大厂面试题?这几个面试必考算法你掌握了吗?
时隔好几天,终于更新了,最近看了很多大厂面试题和相关要求,其中关于常用算法的考察几乎是必须的,但是对于常见算法的学习,只单单的记住某几个程序肯定是不可以的,这就需要深入的对算法的定义、思想、原理及解题上下功夫。
灰小猿
2021/06/09
4780
贪心算法例题
        贪心算法(greedy algorithm ,又称贪婪算法)是指在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,算法得到的是在某种意义上的局部最优解 。贪心算法不是对所有问题都能得到整体最优解,关键是贪心策略的选择 。
周小末天天开心
2023/10/16
2420
贪心算法例题
相关推荐
算法打卡40:会场安排问题
更多 >
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文