T1

problem

要堆一个雪人需要三个不同大小的雪球.现在有n个给定大小的雪球,问能堆起多少个雪人.

ans

数量最多的球先用.比如$100,1,1,1,1$.如果先取$1,1,1$,就只能堆一个,但是如果用了$100$中的一个,就可以堆两个.多的一定先用.所以只要统计+排序就可以了.

T2

problem

超市打折.如果购物车里最少有一个凳子,则可以半价购买购物车里最便宜的物品.现在你要购买n个物品,其中一些是凳子.你有k个购物车,求一个最优的购物方案使得花费最少.

ans

凳子的最大优惠只能是优惠他自己.因为假设一个购物车中凳子不是最贵的,那么只能优惠凳子.如果凳子是最贵的,结果只会更劣.所以把前$k-1$贵的凳子放进前$k-1$个购物车,剩下的全部装在一个购物车里.

T3

problem

有n个罗汉,每个罗汉有重量w和力量s
定义一个罗汉的危险值为上面所有物品的重量值和减去他的力量.安排一个顺序使得危险值最大的罗汉危险值最小.

ans

考虑邻项交换法得到一个结论.按照$w_i+s_i$从小到大的顺序排序结果最优.

T3

problem

[JSOI2007]基地里有n个建筑收到了严重的损伤,但只有一个维修工人.修复一个建筑需要$t_i$的时间,工人一次只能修一个,如果某个建筑在$b_i$时间里没有修好,它就报废了.要求制定一个合理的顺序,来抢修更多建筑.

ans

先按照d从小到大排序,中途对决策做更改.遍历所有建筑i,如果能修就修.

如果不能,那么在先前修复的建筑中找到耗时最大的建筑,时光倒流,如果那个建筑的耗时比这个长,那就放弃那个,改修这个.相当于修同样多的建筑,使用的总时间最短.时光倒流可以通过大根堆实现.

T4

problem

[GDOI2018 D1T2]给定a[1…n],a_i\in [0,m-1],每次操作可以在%m意义下对任意一个区间[l,r]整体+1或者-1,求最少几次操作可以使得所有数字变成0.

ans

对a维护一个差分数组,我们的目标是把差分数组变成全0.区间加减变成了端点加减.一个正数对应一个负数.如果正数之和为A,负数之和为B,那么结果就是$max(A,|B|)$.

T5

problem

给定一个最大240位的大整数S,去掉其中任意N个数字,使得剩下的数字组成一个新的正整数S’.对于给定的N和S,寻找一种方案使得剩下的数字组成的新数S’最小.

ans

从前往后扫,如果一直递增就删掉最后的数.如果出现递减就把拐点删掉然后从头开始再扫一遍.

T6

problem

各处n个正整数,需要把他们连接成一排,组整一个最大的多位整数.

ans

T7

problem

给定一棵n个点的有根树,每个点x上有a[x]朵樱花,设fa[x]表示父亲,son[fa[x]]表示父亲的儿子数.现在可以删掉一些节点,然后被删掉节点的樱花会加给父亲,它的儿子也会接在父亲上.要求删完x之后,fa[x]的樱花数+fa[x]的儿子数<M.问最多能删除多少个点.

ans

自底向上删除,每次删除儿子中a[x]+son[x]最小的一个,这样对自己的增量最小.自底向上删除更有利于实现.而且能删要尽量删除.因为对于一个点和它父亲,只能删除其中一个.如果删除了父亲,会导致爷爷的键值增加,而删除自己就不会,更有利于上层的点被删除.

T8

problem

给出一个n点m边的有向图,且保证前n-1条边构成一个以1为根的dfs树.T-simple的定义是至多一条边不在这棵树上的环.问至少要选中多少条边使得每个T-simple都至少被选中一条边.

ans

因为这是一棵dfs数,所以图中除了树边就只有返祖边了.

先来看一个子问题,如果是一个序列要求若干区间都要被选中,那么就从前往后扫,在未选择区间的右端点选点即可.所以把问题转化到树上也是类似的.

T9

problem

给出一个M个逆序对的数列,求出一个最小的,字典序大于原序列的,逆序对也为M的数列.N<=5e6.

ans

——Gensokyo