枚举(前缀和/差分、尺取、状压)、贪心
邓丝雨 (2021.1.11)
(zhanglichen 2021.2.19)
什么是算法?
先来一道题:NC16669
给出一个序列,对它去重并排序。
时间复杂度和空间复杂度
略。
枚举
例1:最大正方形
在一个(n*n(n<=100))的矩阵中求一个最大的正方形使得该正方形的四个顶点都是由字符'#'构成。设计算法求解。
例2:NC16438回文日期
在两个日期之间有多少个日期是回文日期。
每一年的回文日期最多只有1个,以此可以(O(n))枚举。
前缀和
例3:给定长度为(n)的整数序列(a),找到一组(a_i)和(a_j),(i<j),使得(|a_i-a_j|)最大,设计算法求解
开一个数组记录后缀最大最小值,即可(O(n))求解。
例4:数列求和问题
给出一个数列,(q)次询问,每次询问区间和。
前缀和求解。时间复杂度(O(n))。
差分
例5:数列修改问题
给出一个数列,(m)次修改,每次对一段区间加上一个数,最后输出修改后的序列。
差分求解。时间复杂度(O(n))。
二维前缀和
例6:[HNOI2003]激光炸弹
尺取
例7:POJ3061 Subsequence
给定长度为(n)的正整数序列以及整数(S),求解总和不小于(S)的连续子串的最小值。
思路:前缀和+二分 or 尺取Two Pointer
例8:NC18386 字符串
DP
例9:NC20241 [SCOI2005]扫雷
状压
例10:NC106350 Flip Game
贪心
例11:排队接水
有(n)个人在接水,每个人需要花费(t_i)时间。
请你找一个排队顺序,使得平均等待时间最少。