BZOJ 2135 刷题计划(贪心,求导,二分)BZOJ 修复工程

Posted 繁凡さん

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了BZOJ 2135 刷题计划(贪心,求导,二分)BZOJ 修复工程相关的知识,希望对你有一定的参考价值。

整理的算法模板合集: ACM模板

点我看算法全家桶系列!!!

实际上是一个全新的精炼模板整合计划


题目链接

https://hydro.ac/d/bzoj/p/2135

hydro 的 BZOJ 修复工程 !(我也去领了一点题慢慢修着玩,这题就是我修的嘿嘿嘿)

题目描述

为了提高自己的实力, gx 想要制定一个合理的刷题计划。这里我们用实数来表示题目的难度,并且把刷题计划中由题目难度组成的序列称为刷题序列。gx 刷题最喜欢循序渐进的方式,最理想的情况莫过于刷题序列是个等差数列了。但是这很难做到,于是我们定义一个刷题序列 a a a​​​ 的偏移值 p ( a ) = ∑ i = 2 n ( a i − a i − 1 − L ) 2 \\displaystyle p(a)=\\sum_{i = 2}^{n}(a_i-a_{i-1}-L)^2 p(a)=i=2n(aiai1L)2​,其中 L L L​ 是给定的一个常数。

现在 gx 的老师已经布置给他 n n n​​​ 道必做题,同时他还有空余时间从 OJ 上找 m m m​​ 道题来刷。他不希望改变这 n n n​​ 道必做题的相对顺序,但是选做题的难度以及在数列中的位置都是任意的(OJ 上的题目太多了,随你怎么挑)。

gx 希望你帮他设计一个刷题序列,使得该序列的偏移值最小。

输入格式

输入的第一行包含三个数: n , m , L n, m, L n,m,L n n n 是整数,表示必做题有 n n n 道, m m m 是整数,表示选做题有 m m m 道, L L L 是实数。

第二行包含 n n n 个实数,依次表示每道必做题的难度。

输出格式

输出一个实数,表示最小的偏离值。保留三位小数。

4 3 1.0
1 4 5 3
8.000

数据规模与约定

对于 30 % 30\\% 30% 的数据, n ≤ 500 n\\le 500 n500 m ≤ 200 m\\le 200 m200

对于 70 % 70\\% 70% 的数据, n ≤ 2 × 1 0 4 n\\le 2\\times 10^4 n2×104 m ≤ 1 0 5 m\\le 10^5 m105

对于 100 % 100\\% 100% 的数据, 1 ≤ n ≤ 5 × 1 0 4 1\\le n\\le 5\\times 10^4 1n5×104 1 ≤ m ≤ 1 0 8 1\\le m\\le 10^8 1m108 − 100 ≤ L ≤ 100 -100\\le L\\le 100 100L100 ∣ a i ∣ ≤ 100 |a_i|\\le 100 ai100

存在 50 % 50\\% 50% 的数据, L = 0 L=0 L=0

提示

样例说明:将原序列 ( 1 , 4 , 5 , 3 ) (1,4,5,3) (1,4,5,3) 变成 ( 1 , 2 , 3 , 4 , 5 , 4 , 3 ) (1,2,3,4,5,4,3) (1,2,3,4,5,4,3) ,偏离值为 8.00 8.00 8.00

Solution

题目可以转化为,一个有 n n n 个数的序列,你有 m m m 次操作,每次操作可以在两个数之间插入一个任意大小的数,求得到的新序列的最小偏差值: p ( a ) = ∑ i = 2 n ( a i − a i − 1 − L ) 2 \\displaystyle p(a)=\\sum_{i = 2}^{n}(a_i-a_{i-1}-L)^2 p(a)=i=2n(aiai1L)2

序列一共有 n n n​​​​​​ 个数,每两个数之间可以插入若干个数,显然最开始一共有 n − 1 n-1 n1​​​​​​ 个位置可以插入,也即一共有 n − 1 n-1 n1​​​ 个差值 a i − a i − 1 a_i-a_{i-1} aiai1​​​。对于一个序列 a 1 , a 2 , a 3 a_1,a_2,a_3 a1,a2,a3​​​​​​,一共有两个位置可以操作,让我们在 a 1 , a 2 a_1,a_2 a1,a2​​​​​​ 之间进行一次操作以后,原差值 a 2 − a 1 a_2-a_1 a2a1​​​​​ 就变成了 a 3 − a 2 , a 2 − a 1 a_3-a_2,a_2-a_1 a3a2,a2a1​​​​​​,即每次操作可以把一个差值分成两份,求最后进行 m m m​ 次操作以后得到的 n − 1 + m n-1+m n1+m​ 个差值序列中每个数与 L L L 的差的平方和最小是多少。

我们设这 n − 1 n-1 n1​​ 个差值,第 i i i​ 个差值的值为 s s s​ 分裂 x i x_i xi​ 次。

f ( s , x ) f(s,x) f(s,x)​​ 表示一个数 s s s​,分裂 x x x​ 次后产生的最小平方和,根据柯西不等式,显然我们将 s s s​ 平分成 x + 1 x+1 x+1​ 份是最优的。

因此我们可以得到 :

f ( s , x ) = ( S x + 1 − L ) 2 × ( x + 1 ) = ( s − ( x + 1 ) × L ) 2 x + 1 = s 2 x + 1 + 2 s L + ( x + 1 ) × L 2 \\begin{aligned}f(s, x)&=(\\cfrac {S}{x+1}-L)^2\\times (x+1)&\\\\&=\\cfrac {(s-(x+1)\\times L)^2}{x+1}&\\\\&=\\frac {s^2}{x+1}+2sL+(x+1)\\times L^ 2 \\end{aligned} f(s,x)=(x+1SL)2×(x+1)=x+1(s(x+1)×L)2=x+1BZOJ第一页刷题计划

BZOJ_1620_[Usaco2008_Nov]_Time_Management_时间管理_(二分+贪心)

LeetCode刷题计划

LeetCode刷题计划

LeetCode刷题计划

LeetCode刷题计划