一个让人头疼的算法题-如何安排会议

问题描述

题目:有20个会议室可供使用,使用者需在前一天提交申请,注明时间段比如(8,9)意为要求在8点-9点借用会议室,当然申请的人很多,时间段也不尽相同,管理员为了这事每天晚上都忙得焦头烂额。所以要聪明的你写一个算法帮助管理员解决这个问题,使会议室的安排得最合理?

解决方案

import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;import java.util.Map.Entry;public class ConferenceManager{ /** * 会议室使用记录 */ public static final Map<Integer, List<Conference>> conMap = new HashMap<Integer, List<Conference>>(); /** * 会议室 */ public static final Map<Integer, int[]> timeMap = new HashMap<Integer, int[]>(); // 初始化会议室 static { for (int i = 0; i < 20; i++) { // 20间会议室,都为null conMap.put(i, null); // 每间会议室的时间段都为0,表示没人使用 timeMap.put(i, new int[24]); } } /** * 订会议室 * * @param name * 使用人 * @param startTime * 开始时间 * @param endTime * 结束时间 * @return 订的会议室信息,如果没有会议室返回null */ public static Conference bespoke(String name, Integer startTime, Integer endTime) { // 参数验证 if (startTime > 24 || startTime < 0 || endTime > 24 || endTime < 0 || startTime >= endTime) { throw new IllegalArgumentException(); } Conference con = null; // 每个会议室的时间段遍历 for (final Entry<Integer, int[]> entrys : timeMap.entrySet()) { // 该时间段是否有人使用,0无人使用,1有人使用 int temp = 0; int[] dayTime = entrys.getValue(); // 判断一段时间内是否有人使用会议室 for (int i = startTime; i < endTime; i++) { if (dayTime[i] == 1) { temp = 1; break; } } if (temp == 1) { continue; } // 将会议室的时间段标识为有人使用 for (int i = startTime; i < endTime; i++) { dayTime[i] = 1; } con = new Conference(); con.setName(name); con.setDivan(entrys.getKey()); con.setStartTime(startTime); con.setEndTime(endTime); List<Conference> conList = conMap.get(entrys.getKey()); if (conList == null) { conList = new ArrayList<Conference>(); conMap.put(entrys.getKey(), conList); } // 添加会议室使用记录 conList.add(con); return con; } return con; } public static void main(String[] args) { // 测试代码 Conference con = bespoke("pengwenchao", 8, 9); for (int i = 0; i < 20; i++) { con = bespoke("pengwenchao", 0, 23); } con = bespoke("pengwenchao11", 10, 12); con = bespoke("pengwenchao11", 9, 10); // 打印会议室的使用 System.out.println(conMap); }}
解决方案二:
public class Conference{ /** * 使用人 */ private String name; /** * 开始时间 */ private Integer startTime; /** * 结束时间 */ private Integer endTime; /** * 会议室号码 */ private Integer divan; public Integer getDivan() { return divan; } public void setDivan(Integer divan) { this.divan = divan; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getStartTime() { return startTime; } public void setStartTime(Integer startTime) { this.startTime = startTime; } public Integer getEndTime() { return endTime; } public void setEndTime(Integer endTime) { this.endTime = endTime; } @Override public String toString() { return name + "先生/女士:在" + startTime + "点-" + endTime + "点订了" + divan + "号会议室。"; }}
解决方案三:
你这个好像是设计,设计好了数据结构就完成了。就好像是电影院放映电影一样,什么时间放什么电影,这个电影要在什么时间放,放多长时间,然后下一个电影什么时间放。你的时间段就好像电影开始和结束的时间。不难设计。

时间: 2024-09-29 15:04:14

一个让人头疼的算法题-如何安排会议的相关文章

一个小岛-眼睛的颜色 算法题我的代码为什么不能通过???一个岛上有n个人

问题描述 眼睛的颜色 算法题我的代码为什么不能通过???一个岛上有n个人 一个岛上有n个人,每个人的眼睛要么是蓝色的,要么是黑色的,并且至少有一个人眼睛是蓝色的.每个人都知道至少一个人眼睛是蓝色的事实,但是不知道具体几个人眼睛是蓝色的.每天所有人互相见面,他们可以看到别人的眼睛的颜色,但是看不到自己眼睛的颜色.别人也不能告诉他眼睛的颜色.如果一个人推断出自己的眼睛是蓝色的,他就会在当天离开.求每个人离开在第几天. 输入格式: 多组数据,每组数据第一行是一个正整数n,表示人数.(2<=n<=10

一个算法题,求答案啊啊啊啊

问题描述 一个算法题,求答案啊啊啊啊 白班 09:00-18:00 通班 09:00-21:00 每个人每个月通班数量必须等于早中班和中晚班数量之和 早中班 09:00-15:00 中晚班 15:00-21:00 假设:每月按照30计算. 排班规则: 1.每个人每个月固定休息6天连续上班天数不超过7天. 2.每天各班次上班的人数最低需求:8个白班5个通班1个早中班,2个中晚班. 3.每个月每个人的通班天数安排不超过8天. 4.每个人每个月早中班和中晚班的天数之和需要与通班天数相等. 5.每月最多

时间复杂度-求教一个百度面试的算法题

问题描述 求教一个百度面试的算法题 一个有N个元素的一维数组(A[0],A[1], ..., A[n-1]),设计一个算法求解该数组最大子数组.(要求时间复杂度是O(n)) 解决方案 用动态规划http://www.cnblogs.com/xkfz007/archive/2012/05/17/2506299.html 解决方案二: http://www.ahathinking.com/archives/120.html 解决方案三: 哈,这道题啊,已经遇到好多次了,推荐一个很多人都在练习的网站,

求一个面试算法题答案。

问题描述 求一个面试算法题答案. 已知函数f()以相同的概率返回0或者1,求一个函数g()以相同的概率返回0-7之间的任意一个数字. 解决方案 其实这个题不难,可以考虑用2进制的方式来做.g(){return 4*f()+2*f()+f();} 希望能帮到你. 解决方案二: #includeint g(){srand(time(NULL));ret = rand()%8;return ret;}

面试题-今天朋友去面试看到一个算法题,求解

问题描述 今天朋友去面试看到一个算法题,求解 如题,完全没思路啊orz求指教,按照题目推测似乎是一个两个数之间距离为自身进行排序的算法,但是具体实现完全没思路,实在不行求个算法名也好啊orz 解决方案 public class Test { int n = 4; int[] arr = new int[2*n]; public void init(){//初始化 for(int i = 0; i<2*n; i++){ arr[i] = -1; } } public void sort(int g

想问朋友面试中遇到的一个算法题:

问题描述 想问朋友面试中遇到的一个算法题: Write a program in Java to assess a given string whether it complies with following patterns. Return true if a given string complies with these patterns else false. N = N1 + N2 N>= N1 >= N2 where N is the Nth element in the str

经典算法题每日演练——第七题 KMP算法

原文:经典算法题每日演练--第七题 KMP算法       在大学的时候,应该在数据结构里面都看过kmp算法吧,不知道有多少老师对该算法是一笔带过的,至少我们以前是的, 确实kmp算法还是有点饶人的,如果说红黑树是变态级的,那么kmp算法比红黑树还要变态,很抱歉,每次打kmp的时候,输 入法总是提示"看毛片"三个字,嘿嘿,就叫"看毛片算法"吧. 一:BF算法      如果让你写字符串的模式匹配,你可能会很快的写出朴素的bf算法,至少问题是解决了,我想大家很清楚的知

求助一道算法题,关于数组算法

问题描述 求助一道算法题,关于数组算法 有一个字符串数组{"用户1,商品1,200","用户2,商品2,100","用户3,商品1,300","用户4,商品3,50","用户5,商品3,50"},写的方法需要返回的是{"用户2,商品2","用户3,商品1","用户4,商品3"}也就是说比较下每种商品的最高价格是谁,并返回谁买了,如果价格相同取最先买

经典算法题每日演练——第十五题 并查集

原文:经典算法题每日演练--第十五题 并查集     这一篇我们看看经典又神奇的并查集,顾名思义就是并起来查,可用于处理一些不相交集合的秒杀. 一:场景     有时候我们会遇到这样的场景,比如:M={1,4,6,8},N={2,4,5,7},我的需求就是判断{1,2}是否属于同一个集合,当然实现方法 有很多,一般情况下,普通青年会做出O(MN)的复杂度,那么有没有更轻量级的复杂度呢?嘿嘿,并查集就是用来解决这个问题的.   二:操作   从名字可以出来,并查集其实只有两种操作,并(Union)