10.27,28考试总结
27
T2
小 Z 按时间点从早到晚对 N 位同学排序并依 次编号为 1..N 。但小 Z 并不知道运送行李的货车会在什么时候到来,为了避免 同学
们在宿舍楼下等待太长时间,小 Z 规定,只留最后一位准备好行李的同学 在宿舍楼下看守着行李,若第 i 位同学收拾
好行李后,货车恰好到来,则由这 位同学和小 Z 一起把前 i 位同学的行李搬上货车。 但由于货车有载重量 M 的限制
,小 Z 计划,当货车来临时,会在已经收拾 好行李的前 i 位同学中,在必定选取第 i 位同学的行李的前提下,选取
尽可能 多的同学的行李,优先把他们的行李搬回家。已知货车载重量为 M ,第 i 位同 学的行李重量为 a[i] ,你能
计算出在任何一种情况下,当货车运走第一批行李 后,会剩下多少位已经收拾好行李的同学,享受不到优先运送行李的服务吗
用权值线段树+线段树上二分即可,全值线段树维护个数和和
T3
小 Z 带来的糖果比较特别,一共有 N 个糖果连成一串,编号为 1..N,第 i 个糖果有一个数值 a[i] 表示蛀牙的可能性,数值越大的糖果越容易
导致蛀牙, 多个糖果的蛀牙值认为是各个糖果的蛀牙值之和。 现在小 Z 打算取 N 个糖果的前若干个,分成 K 段分给 K 个
孩子。小 Z 好奇, 他该怎么分糖果,才能使得分到糖果蛀牙值最大的孩子尽可能不蛀牙
二分+dp+树状数组
最大值最小很容易想到二分答案。
然后关键是怎么写 judge
函数。
设 f[i]
表示前 i
个数最多能分成多少段。
转移则有 f[i]=max(f[j]+1)
,其中要满足 sum[i]−sum[j]<=mid
这样就可以做到 O(n2)
的 dp
考虑用数据结构优化一下。
把转移条件换一下形式写成 sum[j]>=sum[i]−mid
然后发现他是一个后缀最大值的东东。
考虑权值线段树或者树状数组,这里 a[i]
的范围比较大,所以我们考虑离线之后用树状数组。
复杂度 O(nlog2n)
T1
排列的一个规律题,当前排列的下一个排列,就是当前排列从后向前找,找到第一个不递增的位置,然后在
这个位置的后面找一个大于当前位置但是最小的一个数,把当前位置替换成这个数,然后剩下的数顺序排列就好了;