背包问题
01背包裸题。因为物品不可分割因此不可贪心。
搬书
Luogu P2374
看起来可以贪心,但是事实上由于体力系数在变化,因此每次选出每堆质量最大的书并不能得到最优解。于是考虑DP。设(dp[i][j][k])表示当前考虑到每堆第(i,j,k)本书。当前状态只能由(dp[i-1][j][k],dp[i][j-1][k],dp[i][j][k-1])更新而来。因此方程就可以显然地列出来了。
排队问题
Luogu P1223
贪心入门题。按照(t)从小到大排序统计就行。显然把小的放在前面比把大的放在前面更优。
神牛果
把吃的数量从小到大排序,每次让最大和最小的组合就可以了。
修理牛棚
Luogu P1209
我们可以先假设只有一块木板从编号最小的牛棚一直铺到编号最大的牛棚,然后断开(m-1)处。自然要按相邻牛棚的编号差从大到小断开才能使我们断开的地方可以有效节省木板长度(因为中间省去的要更多)
删数
Luogu P1106
首先,考虑第一位。将第一位所有可能的位置枚举一下,取最小且最前的一个。因为同样长度的数字比较看开头,于是这样便保证了第一位的最优性。要注意,要取最前的一个,尽量保留更多的可选数。而第二位就在第一个数之后的所有允许范围内枚举,方法同第一位。这样,取完了所有要取的数,然后输出就可以了。
奶酪工厂
POJ 2393
显然有一个事实,记第(i)天单价为(c_i),第(i-1)天生产的成本为(c_{i-1}),那么当(c_i > c_{i-1} + s)时在第(i-1)天生产第(i)天的奶酪最优。
因为是按顺序操作的,(c_i)一定会从最优的(c_{i-1})更新过来,因此无后效性。
堆积木
Luogu P1842
一开始想了一个优秀的随机化算法,原理就是随机生成一个(1)~(n)的排列,然后查询答案,但是由于数据范围很大,很难在(1s)得到答案。
于是考虑贪心。按照(w+s)可得到最优排列。
国王游戏
Luogu P1080
首先假设只有两个大臣,模拟一下发现排列顺序仅由(a*b)决定。
如果多来几个人,那么可以把(1)~(n-1)当成一个大臣,然后仍然按照两个大臣模拟。
所以贪心策略就出来了,按照(a*b)排序就行了。
统计答案的时候需要写高精度乘法、除法。
智力大冲浪
Luogu 1230
显然贪心一下,扣钱最多的游戏要先处理。可以在([1,t_i])范围内处理,贪心地想一定要尽可能往后放。所以先按照扣钱排序,枚举每个游戏放在哪个时间处理,(t_i)到1倒序枚举放的位置,如果放不了则这个游戏不选,直接计算扣的钱。
整数区间
定义(s[i])表示([0,i])选了多少个数。如果有一个区间([l,r]),则必然满足(s[r]-s[l-1] geq 2),而每个数显然只能选一次,有(s[i] - s[i - 1] leq 1),并且(s[i] - s[i - 1] geq 0),那么按照这几个不等式连边跑差分约束系统就可以了。
活动选择
按照区间右端点排序,选择左端点就行。
雷达安装
Luogu P1325
以每个点为圆心,半径为(d)画圆,在海岸线上有(l,r)两个交点,然后转化为区间选点问题。
显然没有交点自然就无解了。
晒衣服
Luogu P1843
每次二分一个时间(t),假设有(q)件衣服在(t)天后仍然是湿的,这个(q>k)则答案不合法,否则答案合法。
游戏通关
其实就是把智力大冲浪反过来处理就行,并查集优化一下。
探险
POJ 2431
为了减少加油次数,显然应该选取加油量最多的加油站。而为了保证是否能选,就需要先按照距离排序再处理。那么就可以得到一个按照当前油量可以到达的所有加油站的区间。在这些加油站中就需要选出加油量最多的。可以用一个堆来实现取出最大值操作。总复杂度 (O(nlog_n))
优惠券
Luogu P3045
显然价值越低越应该买,所以我们用一个堆维护价格,记录用过的优惠券数量。然后扫一遍就行了。复杂度(O(nlog_n))
探讨人生
因为只有两个人,所以暴力枚举探讨次数就可以了。剪枝:先保证与(A)探讨单位时间经验更多。为了使枚举的探讨次数控制在(sqrt n)以内,需要判断一下:若(a> sqrt n),则枚举次数一定小于(sqrt n),正常枚举与(A)探讨次数即可。否则,枚举与(B)探讨次数。因为与(A)探讨更优,即与(A)探讨(b)次优于与(B)探讨(a)次,当枚举与(B)探讨次数大于等于(a)时,一定不如把其中的(a)次变成和(A)探讨。所以最多只要枚举(a)次。
数字游戏
SDUT 1310
显然直接贪心一定(GG)
考虑一下假设我们选了(a_i,a_j)两个数,并且规定(b_i < b_j),那么应该先选(a_j),因为假设分别在第(x,y)回合选了(a_i,a_j),若先选(a_i),对答案的贡献是(a_i - x imes b_i + a_j - y imes b_j) ,反过来则是(a_i - y imes b_i + a_j - x imes b_j),作差得((y-x)(b_i-b_j)),可见先选(a_j)对答案贡献更大。那么只要按照(b)从大到小排序,进行(dp)转移就行。
定义(dp[i][j])表示前(i)个数里选出(j)个的最大得分,有(dp[i][j]=max(dp[i-1][j],dp[i-1][j-1] + a[i] - b[i] * (j - 1))
(dp[n][m])即为答案。
马步距离
Luogu P2060
显然直接暴搜数据范围受不了,于是我们考虑贪心一下,每次移动应该尽可能使得到终点切比雪夫距离更小。但是小范围内正确性无法保证,于是打个表处理一下就行了。