贪心算法-会议室安排

    技术2025-11-09  6

    package com.sibat.police.study.java.string; import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.stream.Collectors; /** * @Author: zhangrenyou * @Date: 2020/7/4 17:09 */ public class GreedMeeting { /** * 安排会议室,要求时间长优先,时间早优先 * 8,10 9,12 10,14 14,19 17,21 0,0 * 贪心算法 * 寻找局部最优解 * 这里的定义是时间长的优先,因此先遍历所有安排,找出时间最长的,同长找最早的 * 再遍历剩下的结果,去掉时间冲突的结果,再排序寻找时间最长的,同长找最早的 * 递归上述结果 * @param args */ public static void main(String[] args) { List<Meeting> times = new ArrayList<>(); Scanner scanner = new Scanner(System.in); String line = scanner.nextLine(); if (!check(line)) { System.out.println("输出错误,请重新输入!"); return; } String[] t = line.split(","); while (!"0".equals(t[0]) || !"0".equals(t[1])) { Meeting time = new Meeting(); int t0 = Integer.parseInt(t[0]); int t1 = Integer.parseInt(t[1]); if(t1>t0&&8<=t0&&t0<=21&&8<=t1&&t1<=21){ time.setStart(t0); time.setEnd(t1); time.setTime(t1-t0); times.add(time); }else { System.out.println("输出错误,请重新输入!"); return; } line = scanner.nextLine(); if(!check(line)){ System.out.println("输出错误,请重新输入!"); return; } t = line.split(","); } List<Meeting> already = new ArrayList<>(); times = times.stream().sorted(Comparator.comparing(Meeting::getTime).thenComparing(Meeting::getStart).reversed()).collect(Collectors.toList()); sortAndChoose(times,already); System.out.println(already.size()); } private static void sortAndChoose(List<Meeting> times,List<Meeting> already){ if(times!=null&&times.size()>0) { already.add(times.get(0)); removeConflict(times); times = times.stream().sorted(Comparator.comparing(Meeting::getTime).thenComparing(Meeting::getStart)).collect(Collectors.toList()); sortAndChoose(times,already); } } private static void removeConflict(List<Meeting> meetings){ if(meetings!=null){ if(meetings.size()==1){ meetings.remove(0); }else { Meeting one = meetings.get(0); meetings.remove(0); Iterator<Meeting> iterator = meetings.iterator(); while (iterator.hasNext()){ Meeting m = iterator.next(); Integer o1 = one.getStart(); Integer o2 = one.getEnd(); Integer m1 = m.getStart(); Integer m2 = m.getEnd(); if((o1<=m1&&m1<o2)||(o1<m2&&m2<=o2)){ iterator.remove(); } } } } } private static boolean check(String line) { if (line == null) { return false; } Pattern pattern = Pattern.compile("(?=[0-9]+,[0-9]+).+"); Matcher matcher = pattern.matcher(line); return matcher.find(); } public static class Meeting{ private Integer start; private Integer end; private Integer time; public Integer getStart() { return start; } public void setStart(Integer start) { this.start = start; } public Integer getEnd() { return end; } public void setEnd(Integer end) { this.end = end; } public Integer getTime() { return time; } public void setTime(Integer time) { this.time = time; } } }

     

    Processed: 0.013, SQL: 10