算法体系结构第十四课

一、怎样让一天内开会场次最多

1.贪心
按照会议结束的时间进行排序,如果有开始时间比此次会议的结束时间晚的,就办它,再让时间线等于它的结束时间;

2.暴力
每次拿出一个会议当做要安排的第一个会议,通过递归看看这样安排后还能安排多少会议;
递归函数:每次将遍历到的数组元素删掉的新数组进行递归

二、分金问题
描述:拆分金条,每次拆分时都要花费与金条长度对应的铜板,问怎么花费最少的铜板切成给定长度的金块

1.贪心
把给定的数组放入小根堆中,弹出两个,加起来,记一下代价,放入堆中,直到堆只剩一个;

2.暴力
取任意两个数合并在一起,形成新的数组,用递归进行代价的获取;
还剩一个元素时就返回累计代价,有两个及以上的元素时就对元素进行合并,以及代价的相加;

三、IPO
给定n个项目,每个项目有各自的启动资金和利润,做完一个项目可以将利润加到持有资金中,持有资金为W,最多串行做K个项目,如何让最后持有资金最多(启动资金 + 纯利润)

思路:先让项目按照启动资金大小放入小根堆,把启动资金小于等于持有资金的项目按利润大小放入大根堆,弹出一个项目,将其利润加入持有资金,重复K次即可;

RPG思路:该题类似于打怪升级,等级低的时候就挑战比自己等级低或相当的怪,
先把怪从小到大列出来,把自己等级以下的怪按照经验值从大到小排序,挑战经验给的最多的一个即可;

四、点灯
有灯和墙两种元素,
灯,需要也可以被点亮,如果被点亮了就可以照亮左右的灯或墙,
墙,可以但不需要被照亮,但不能被点亮,
要求得到所有灯都亮起来的最小点灯数;

贪心:
1.如果i位置是墙,那就往后遍历,
2.如果i位置是灯
(1)如果 i + 1位置是墙,点亮 i,跳到i + 2,
(2)如果 i + 1位置是灯,i + 2位置是墙,点谁无所谓,跳到 i + 3,
(3)如果 i + 1位置是灯,i + 2位置是灯,点亮 i + 1,跳到 i + 4;

暴力:
没看懂

五、并查集

1.组成
(1)对结点包一层,相当于值对应了结点的表

	包一层是为了方便isSameSet在比较的时候能够进行"=="比较
	如果V是基本类型的话,比较的时候不管是"=="还是equals都不能进行区分
	public static class Node<V> {
    
    
        V value;

        public Node(V value) {
    
    
            this.value = value;
        }
    }
    public static class UnionSet<V> {
    
    
		public HashMap<V, Node<V>> nodes;

(2)父表:设置结点的上级直系亲属,最老祖先的父是自己

(3)尺寸表:负责记录每个set的大小,只有最老祖先,也就是代表结点才会在该表里被记录

2.找到代表结点(附带扁平化功能)
准备一个栈,通过父亲表把祖辈扔进栈中,修改祖辈的父子关系,返回代表结点;

3.判断两个元素是否在同一表里
代表结点是否地址相同

4.把两个所在表不同的结点对应的表糅合在一起
找代表结点,定大小,修改父亲表和尺寸表

2021.10.8: 算法 6h

Guess you like

Origin blog.csdn.net/dgytjhe/article/details/120645683