Expm 8_1 区间划分问题
【问题描述】
给定一组报告,其中的每个报告设置了一个开始时间si和结束时间fi。设计与实现一个算法,对这组报告分配最少数量的教室,使得这些报告能无冲突的举行。
package org.xiu68.exp.exp8; import java.util.ArrayList;
import java.util.Comparator; public class Exp8_1 { public static void main(String[] args) {
// TODO Auto-generated method stub
ArrayList<Report> reports=new ArrayList<>();
reports.add(new Report(7,10));
reports.add(new Report(8,11));
reports.add(new Report(9,13));
reports.add(new Report(12,14));
reports.add(new Report(13,15));
intervalPartition(reports);
} public static void intervalPartition(ArrayList<Report> reports){
reports.sort(new comp()); //按开始时间对报告进行排序 //不使用优先队列
//ArrayList<Integer> classrooms=new ArrayList<>();
//classrooms.get(i)表示第i间教室的报告的结束时间
//classrooms.add(reports.get(0).endTime); //使用优先队列
PriorityQueue<ClassRoom> classrooms=new PriorityQueue<>();
//首先为第1份报告分配教室
classrooms.add(new ClassRoom(reports.get(0).endTime)); for(int i=1;i<reports.size();i++){
//不使用优先队列
/*boolean flag=false; //是否找到教室
for(int j=0;j<classrooms.size();j++){
if(reports.get(i).startTime>=classrooms.get(j)){ //找到教室
classrooms.set(j, reports.get(i).endTime);
flag=true;
break;
}
}
if(flag==false){ //找不到教室,另分配一间教室
classrooms.add(reports.get(i).endTime);
}*/ //使用优先队列
if(reports.get(i).startTime>=classrooms.getMin().endTime){ //找到教室
//教室来了新报告后需要调整使用教室的结束时间
classrooms.setFirstElement(new ClassRoom(reports.get(i).endTime));
}else{
classrooms.add(new ClassRoom(reports.get(i).endTime)); //找不到教室,新开辟一间教室
} }
System.out.println("最少需要 "+classrooms.size()+" 间教室");
} } class Report{
public int startTime; //开始时间
public int endTime; //结束时间 public Report(int startTime, int endTime) {
super();
this.startTime = startTime;
this.endTime = endTime;
}
} class ClassRoom implements Comparable<ClassRoom>{
public int endTime;
public ClassRoom(int endTime){
this.endTime=endTime;
}
@Override
public int compareTo(ClassRoom o) {
// TODO Auto-generated method stub
if(endTime>o.endTime)
return 1;
else
return -1;
}
}
class comp implements Comparator<Report>{
@Override
//按开始时间排序报告的比较方法
public int compare(Report r1, Report r2) {
// TODO Auto-generated method stub
if(r1.startTime>r2.startTime)
return 1;
else
return -1;
}
}
package org.xiu68.exp.exp8; import java.util.Comparator;
import java.util.NoSuchElementException; public class PriorityQueue<E extends Comparable<E>> {
private E[] heap;
private int size;
private Comparator<E> comp; @SuppressWarnings("unchecked")
public PriorityQueue(){
heap=(E[])new Comparable[5];
}
public PriorityQueue(Comparator<E> comp){
this();
this.comp=comp;
} @SuppressWarnings("unused")
private int compare(E e1,E e2){
if(comp==null)
return e1.compareTo(e2);
else
return comp.compare(e1, e2);
} @SuppressWarnings("unchecked")
public void add(E element){
//如果添加元素后数组已满,则先扩容再加入
if(++size==heap.length){
E[] e=(E[])new Comparable[heap.length*2];
System.arraycopy(heap, 0, e, 0, size);
heap=e;
}
heap[size-1]=element;
adjust();
} //设置堆顶元素,需要从堆顶开始调整堆
public void setFirstElement(E element){
if(size<=0){
throw new NoSuchElementException();
}
heap[0]=element;
adjustFromIndex(0);
}
public void adjustFromIndex(int i){
//由于从序号为0开始存储,需要加这段
if(i==0 && size>1){
int j;
if(size>2){ //大于等于3个元素
j=(compare(heap[i+1],heap[i+2])>0?i+1:i+2); //j为左右孩子的最小者的下标
}else{ //只有两个元素
j=i+1;
}
if(compare(heap[i],heap[j])>0){ //父结点大于子结点,交换值
E temp=heap[i];
heap[i]=heap[j];
heap[j]=temp;
}
adjustFromIndex(j);
} int parent=i;
int child=2*i;
while(child<=size-1){
//child<size-1表示parent左右孩子都存在
//child存放左右孩子最大者数组下标
if(child<size-1 && compare(heap[child],heap[child+1])>0){
child+=1;
}
if(compare(heap[parent],heap[child])<=0){ //父结点大于子结点,停止调整
break;
}else{
E temp=heap[parent];
heap[parent]=heap[child];
heap[child]=temp;
parent=child;
child=2*parent;
}
}
}
//从新加入元素开始调整堆
public void adjust(){
int newElement=size-1;
int parentElement;
while(newElement>0){ //还没有调整到根结点
parentElement=newElement/2; //根结点为newElement/2向下取整 //如果父结点小于等于子结点则不需要调整
if(compare(heap[parentElement],heap[newElement])<=0){
break;
}
//交换父结点与子结点的值
E temp=heap[parentElement];
heap[parentElement]=heap[newElement];
heap[newElement]=temp;
newElement=parentElement;
}
}
//获取最小元素
public E getMin(){
if(size==0){
throw new NoSuchElementException();
}
return heap[0];
}
//返回队列大小
public int size(){
return size;
}
}
Expm 8_1 区间划分问题的更多相关文章
- Expm 7_2区间调度问题
[问题描述] 给定n个活动,其中的每个活动ai包含一个起始时间si与结束时间fi.设计与实现算法从n个活动中找出一个最大的相互兼容的活动子集S. 要求:分别设计动态规划与贪心算法求解该问题.其中,对贪 ...
- ACM学习大纲
1 推荐题库 •http://ace.delos.com/usaco/ 美国的OI 题库,如果是刚入门的新手,可以尝试先把它刷通,能够学到几乎全部的基础算法极其优化,全部的题解及标程还有题目翻译可以b ...
- ACM训练大纲
1. 算法总结及推荐题目 1.1 C++ STL • STL容器: set, map, vector, priority_queue, queue, stack, deque, bitset• STL ...
- ACM学习大纲(转)
1 推荐题库 •http://ace.delos.com/usaco/ 美国的OI 题库,如果是刚入门的新手,可以尝试先把它刷通,能够学到几乎全部的基础算法极其优化,全部的题解及标程还有题目翻译可以b ...
- Copying Books
Copying Books 给出一个长度为m的序列\(\{a_i\}\),将其划分成k个区间,求区间和的最大值的最小值对应的方案,多种方案,则按从左到右的区间长度尽可能小(也就是从左到右区间长度构成的 ...
- 区间dp 整数划分问题
整数划分(四) 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描述 暑假来了,hrdv 又要留学校在参加ACM集训了,集训的生活非常Happy(ps:你懂得),可是他最近 ...
- Leetcode1000 合并石头的最低成本 区间DP
有 N 堆石头排成一排,第 i 堆中有 stones[i] 块石头. 每次移动(move)需要将连续的 K 堆石头合并为一堆,而这个移动的成本为这 K 堆石头的总数. 找出把所有石头合并成一堆的最低成 ...
- 专题训练之区间DP
例题:以下例题部分的内容来自https://blog.csdn.net/my_sunshine26/article/details/77141398 一.石子合并问题 1.(NYOJ737)http: ...
- 牛客网 暑期ACM多校训练营(第二场)J.farm-STL(vector)+二维树状数组区间更新、单点查询 or 大暴力?
开心.jpg J.farm 先解释一下题意,题意就是一个n*m的矩形区域,每个点代表一个植物,然后不同的植物对应不同的适合的肥料k,如果植物被撒上不适合的肥料就会死掉.然后题目将每个点适合的肥料种类( ...
随机推荐
- P1186 玛丽卡 删边最短路最大值
反正蛮水的一道题. 胡雨菲一句话让我的代码减少了10行还A了,之前的是个错的. 思路:先求出最短路,然后依次删去最短路上的每一条边,跑最短路求最大值. 关于删边:我的想法是当作链表删除,把last的n ...
- P1856 矩形周长
哇!这小破题坑了我好久. 扫描线+线段树 这题数据范围小,没离散化.真要离散化我还搞不好呢. 具体的看这个博客吧. 主要是这个坑爹的c,len把我搞了,其他的还好. 代码: #include < ...
- Ubuntu下安装nfs服务器
安装 NFS 软件包在 ubuntu 终端输入下面命令安装 NFS 服务器:vmuser@Linux-host: ~$ sudo apt-get install nfs-kernel-server # ...
- 数据类型、位运算、sizeof()函数
数据精度,依次升高.(负数必须使用有符号类型) 不同精度的数据间运算,所得结果为高精度类型. 数据类型详细信息如下图: 整型数据的数制:十进制(32).八进制(032,以0开头).十六进制(0x32, ...
- terminal下历史命令自动完成功能history auto complete
CentOS下,有一个很智能的功能,就是只输入一条历史命令的前几个字母,再按PageUp和PageDown键,就可以在以此字母为前缀的历史命令中上下切换.这个功能非常实用,而且比CTRL+R使用起来更 ...
- call_user_func 和 call_user_func_array用法
说明 call_user_func 和 call_user_func_array 相同:都可以调用函数和类内部的函数,不同:不同的是传递的参数不同,前者是一个参数一个参数传递, 后者是传递array参 ...
- 第2课:什么是SQL注入
SQL注入:利用现有应用程序,将(恶意)的SQL命令注入到后台数据库引擎执行的能力,这是SQL注入的标准释义. 随着B/S模式被广泛的应用,用这种模式编写应用程序的程序员也越来越多,但由于开发人员的水 ...
- 2.如何导入Spring约束?
前言:之前在学习约束的时候,关于导入约束一直迷茫,今天详细的截图一下,以下图为例 第一步: 新建 第二步: 第三步: 第四步: 第五步:(这里写的有点小错误,是第三个) 第六步: 然后点击OK 最后的 ...
- 安装使用hibernate tools
help-Eclipse marketplace-hibernate(搜索)-jboss tools(安装)
- springboot环境下配置过滤器和拦截器
以前我们在配置过滤器和拦截器的时候,都是一个类继承一个接口,然后在xml中配置一下就ok 但是,但是,这是springboot的环境,没有xml的配置.所以我们还要继续学习啊啊啊啊啊~~~~~ 先简单 ...