【问题描述】

给定一组报告,其中的每个报告设置了一个开始时间si和结束时间fi。设计与实现一个算法,对这组报告分配最少数量的教室,使得这些报告能无冲突的举行。

  1. package org.xiu68.exp.exp8;
  2.  
  3. import java.util.ArrayList;
  4. import java.util.Comparator;
  5.  
  6. public class Exp8_1 {
  7.  
  8. public static void main(String[] args) {
  9. // TODO Auto-generated method stub
  10. ArrayList<Report> reports=new ArrayList<>();
  11. reports.add(new Report(7,10));
  12. reports.add(new Report(8,11));
  13. reports.add(new Report(9,13));
  14. reports.add(new Report(12,14));
  15. reports.add(new Report(13,15));
  16. intervalPartition(reports);
  17. }
  18.  
  19. public static void intervalPartition(ArrayList<Report> reports){
  20. reports.sort(new comp()); //按开始时间对报告进行排序
  21.  
  22. //不使用优先队列
  23. //ArrayList<Integer> classrooms=new ArrayList<>();
  24. //classrooms.get(i)表示第i间教室的报告的结束时间
  25. //classrooms.add(reports.get(0).endTime);
  26.  
  27. //使用优先队列
  28. PriorityQueue<ClassRoom> classrooms=new PriorityQueue<>();
  29. //首先为第1份报告分配教室
  30. classrooms.add(new ClassRoom(reports.get(0).endTime));
  31.  
  32. for(int i=1;i<reports.size();i++){
  33. //不使用优先队列
  34. /*boolean flag=false; //是否找到教室
  35. for(int j=0;j<classrooms.size();j++){
  36. if(reports.get(i).startTime>=classrooms.get(j)){ //找到教室
  37. classrooms.set(j, reports.get(i).endTime);
  38. flag=true;
  39. break;
  40. }
  41. }
  42. if(flag==false){ //找不到教室,另分配一间教室
  43. classrooms.add(reports.get(i).endTime);
  44. }*/
  45.  
  46. //使用优先队列
  47. if(reports.get(i).startTime>=classrooms.getMin().endTime){ //找到教室
  48. //教室来了新报告后需要调整使用教室的结束时间
  49. classrooms.setFirstElement(new ClassRoom(reports.get(i).endTime));
  50. }else{
  51. classrooms.add(new ClassRoom(reports.get(i).endTime)); //找不到教室,新开辟一间教室
  52. }
  53.  
  54. }
  55. System.out.println("最少需要 "+classrooms.size()+" 间教室");
  56. }
  57.  
  58. }
  59.  
  60. class Report{
  61. public int startTime; //开始时间
  62. public int endTime; //结束时间
  63.  
  64. public Report(int startTime, int endTime) {
  65. super();
  66. this.startTime = startTime;
  67. this.endTime = endTime;
  68. }
  69. }
  70.  
  71. class ClassRoom implements Comparable<ClassRoom>{
  72. public int endTime;
  73. public ClassRoom(int endTime){
  74. this.endTime=endTime;
  75. }
  76. @Override
  77. public int compareTo(ClassRoom o) {
  78. // TODO Auto-generated method stub
  79. if(endTime>o.endTime)
  80. return 1;
  81. else
  82. return -1;
  83. }
  84. }
  85. class comp implements Comparator<Report>{
  86. @Override
  87. //按开始时间排序报告的比较方法
  88. public int compare(Report r1, Report r2) {
  89. // TODO Auto-generated method stub
  90. if(r1.startTime>r2.startTime)
  91. return 1;
  92. else
  93. return -1;
  94. }
  95. }
  1. package org.xiu68.exp.exp8;
  2.  
  3. import java.util.Comparator;
  4. import java.util.NoSuchElementException;
  5.  
  6. public class PriorityQueue<E extends Comparable<E>> {
  7. private E[] heap;
  8. private int size;
  9. private Comparator<E> comp;
  10.  
  11. @SuppressWarnings("unchecked")
  12. public PriorityQueue(){
  13. heap=(E[])new Comparable[5];
  14. }
  15. public PriorityQueue(Comparator<E> comp){
  16. this();
  17. this.comp=comp;
  18. }
  19.  
  20. @SuppressWarnings("unused")
  21. private int compare(E e1,E e2){
  22. if(comp==null)
  23. return e1.compareTo(e2);
  24. else
  25. return comp.compare(e1, e2);
  26. }
  27.  
  28. @SuppressWarnings("unchecked")
  29. public void add(E element){
  30. //如果添加元素后数组已满,则先扩容再加入
  31. if(++size==heap.length){
  32. E[] e=(E[])new Comparable[heap.length*2];
  33. System.arraycopy(heap, 0, e, 0, size);
  34. heap=e;
  35. }
  36. heap[size-1]=element;
  37. adjust();
  38. }
  39.  
  40. //设置堆顶元素,需要从堆顶开始调整堆
  41. public void setFirstElement(E element){
  42. if(size<=0){
  43. throw new NoSuchElementException();
  44. }
  45. heap[0]=element;
  46. adjustFromIndex(0);
  47. }
  48. public void adjustFromIndex(int i){
  49. //由于从序号为0开始存储,需要加这段
  50. if(i==0 && size>1){
  51. int j;
  52. if(size>2){ //大于等于3个元素
  53. j=(compare(heap[i+1],heap[i+2])>0?i+1:i+2); //j为左右孩子的最小者的下标
  54. }else{ //只有两个元素
  55. j=i+1;
  56. }
  57. if(compare(heap[i],heap[j])>0){ //父结点大于子结点,交换值
  58. E temp=heap[i];
  59. heap[i]=heap[j];
  60. heap[j]=temp;
  61. }
  62. adjustFromIndex(j);
  63. }
  64.  
  65. int parent=i;
  66. int child=2*i;
  67. while(child<=size-1){
  68. //child<size-1表示parent左右孩子都存在
  69. //child存放左右孩子最大者数组下标
  70. if(child<size-1 && compare(heap[child],heap[child+1])>0){
  71. child+=1;
  72. }
  73. if(compare(heap[parent],heap[child])<=0){ //父结点大于子结点,停止调整
  74. break;
  75. }else{
  76. E temp=heap[parent];
  77. heap[parent]=heap[child];
  78. heap[child]=temp;
  79. parent=child;
  80. child=2*parent;
  81. }
  82. }
  83. }
  84. //从新加入元素开始调整堆
  85. public void adjust(){
  86. int newElement=size-1;
  87. int parentElement;
  88. while(newElement>0){ //还没有调整到根结点
  89. parentElement=newElement/2; //根结点为newElement/2向下取整
  90.  
  91. //如果父结点小于等于子结点则不需要调整
  92. if(compare(heap[parentElement],heap[newElement])<=0){
  93. break;
  94. }
  95. //交换父结点与子结点的值
  96. E temp=heap[parentElement];
  97. heap[parentElement]=heap[newElement];
  98. heap[newElement]=temp;
  99. newElement=parentElement;
  100. }
  101. }
  102. //获取最小元素
  103. public E getMin(){
  104. if(size==0){
  105. throw new NoSuchElementException();
  106. }
  107. return heap[0];
  108. }
  109. //返回队列大小
  110. public int size(){
  111. return size;
  112. }
  113. }

Expm 8_1 区间划分问题的更多相关文章

  1. Expm 7_2区间调度问题

    [问题描述] 给定n个活动,其中的每个活动ai包含一个起始时间si与结束时间fi.设计与实现算法从n个活动中找出一个最大的相互兼容的活动子集S. 要求:分别设计动态规划与贪心算法求解该问题.其中,对贪 ...

  2. ACM学习大纲

    1 推荐题库 •http://ace.delos.com/usaco/ 美国的OI 题库,如果是刚入门的新手,可以尝试先把它刷通,能够学到几乎全部的基础算法极其优化,全部的题解及标程还有题目翻译可以b ...

  3. ACM训练大纲

    1. 算法总结及推荐题目 1.1 C++ STL • STL容器: set, map, vector, priority_queue, queue, stack, deque, bitset• STL ...

  4. ACM学习大纲(转)

    1 推荐题库 •http://ace.delos.com/usaco/ 美国的OI 题库,如果是刚入门的新手,可以尝试先把它刷通,能够学到几乎全部的基础算法极其优化,全部的题解及标程还有题目翻译可以b ...

  5. Copying Books

    Copying Books 给出一个长度为m的序列\(\{a_i\}\),将其划分成k个区间,求区间和的最大值的最小值对应的方案,多种方案,则按从左到右的区间长度尽可能小(也就是从左到右区间长度构成的 ...

  6. 区间dp 整数划分问题

    整数划分(四) 时间限制:1000 ms  |  内存限制:65535 KB 难度:3   描述 暑假来了,hrdv 又要留学校在参加ACM集训了,集训的生活非常Happy(ps:你懂得),可是他最近 ...

  7. Leetcode1000 合并石头的最低成本 区间DP

    有 N 堆石头排成一排,第 i 堆中有 stones[i] 块石头. 每次移动(move)需要将连续的 K 堆石头合并为一堆,而这个移动的成本为这 K 堆石头的总数. 找出把所有石头合并成一堆的最低成 ...

  8. 专题训练之区间DP

    例题:以下例题部分的内容来自https://blog.csdn.net/my_sunshine26/article/details/77141398 一.石子合并问题 1.(NYOJ737)http: ...

  9. 牛客网 暑期ACM多校训练营(第二场)J.farm-STL(vector)+二维树状数组区间更新、单点查询 or 大暴力?

    开心.jpg J.farm 先解释一下题意,题意就是一个n*m的矩形区域,每个点代表一个植物,然后不同的植物对应不同的适合的肥料k,如果植物被撒上不适合的肥料就会死掉.然后题目将每个点适合的肥料种类( ...

随机推荐

  1. http和https的作用与区别

    PS: https就是http和TCP之间有一层SSL层,这一层的实际作用是防止钓鱼和加密.防止钓鱼通过网站的证书,网站必须有CA证书,证书类似于一个解密的签名.另外是加密,加密需要一个密钥交换算法, ...

  2. RESTful框架简述

    什么是RESTful架构: (1)每一个URI代表一种资源: (2)客户端和服务器之间,传递这种资源的某种表现层: (3)客户端通过四个HTTP动词,对服务器端资源进行操作,实现"表现层状态 ...

  3. if语句和case语句用法展示

    if语句和case语句用法展示 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.单分支if条件语句 1>.语法格式一 if [ 条件判断式 ];then 源代码 fi 2& ...

  4. 函数和常用模块【day04】:内置函数(九)

    一.11-20 11.ord(c) 功能:根据字符,找到对应的ascii值 1 2 >>> ord('a') 97 12.classmethod(function) 功能:类方法,这 ...

  5. 学习windows编程 day3 之窗口绘画二:边框绘制函数

    #include <windows.h> LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM l ...

  6. 02、@PropertySource指定配置文件的属性映射到JavaBean属性

    零.@PropertySource 功能类似于 <context:property-placeholder location="classpath*:/config/load.prop ...

  7. MySQL锁解决并发问题详解

    文章分为以下几个要点 问题描述以及解决过程 MySQL锁机制 数据库加锁分析 下面讨论的都是基于MySQL的InnoDB. 0. 问题描述以及解决过程 因为涉及到公司利益问题,所以下面很多代码和数据库 ...

  8. DTP协议攻击

    DTP协议 动态中继协议DTP(Dynamic Trunking Protocol)是一种Cisco私有协议.DTP用于两台交换机的直连二层端口探测对端的配置,自动协商出二层端口的链路类型和以太网封装 ...

  9. 【BZOJ】1443: [JSOI2009]游戏Game

    [算法]博弈论+二分图匹配(最大流) [题解]方格图黑白染色得到二分图, 二分图博弈:当起点不属于某个最大匹配时,后手必胜. 问题转化为那些点不属于某个最大匹配. 先找到一个最大匹配,非匹配点加入答案 ...

  10. Error while executing topic command : Replication factor: 2 larger than available brokers: 0.

    [root@hdp1 /mnt/software/maxwell-1.19.4]#kafka-topics.sh --zookeeper hdp1,hdp2,hdp3:2181 --create -- ...