Description:
贝壳找房的攻城狮最近在研究一次函数 f(x)=ax+b。
现在有 n 个一次函数,fi(x)=aix+bi, i={1...n}。
容易发现,一次函数嵌套一次函数,还是一次函数。
fi(fj(x))=ai(ajx+bj)+bi
给定 x,并且对于所有的 fi(x) 可以任意改变顺序嵌套函数,求 f(f(f(…f(x))…)的最大值。
Input:
一个整数 T(T≤20) 代表数据组数。
每组数据:
第一行两个整数 n, x 代表一共有 n 个函数 (1≤n≤10000, 0≤x≤9)。
第二行 n 个整数代表 ai ,1≤ai≤9 。
第三行 n 个整数代表 bi, 1≤bi≤9 。
Output:
为了使问题简化,对于每组数据只需要输出最大值的个位即可。(比如函数的值可能是 19 或者 23 ,但最终应该输出的是 3 ) 。题解:
题目很明显是要找出函数的嵌套顺序(搜索是10000的阶乘0.0而且有后效性没法动规),下面给出排序的策略。
1.官方题解:假设两个函数(ai,bi),(aj,bj),则有两种嵌套顺序
ai*(aj*x+bj)+ bi = ai*aj*x + ai*bj + bi
aj*(ai*x+bi)+ bj = aj*ai*x + aj*bi + bj
显然函数嵌套顺序与x无关,只与后面的常数项有关,所以按照 ai*bj + bi < aj*bi + bj 给函数排序即可求出最大值
感觉证明过程有点不完整,稍微补充下。
又假设两个函数时得出的结论,当我们假设有三个函数i,j,k时,如果fi(fj(x))>fj(fi(x)),那么当k为最外层时,最大值为fk(fi(fj(x)))
此时我们可将fj(x)看做X,则三个函数的假设又变成了两个函数的假设:fk(fi(X))?fi(fk(X)),可以通过之前的比较方法继续比较来决定是否交换i与k的嵌套顺序,由此可以推出任意个函数求最值都符合这个规律。
2.大佬题解:按照(a-1)/b的大小排序
证明:
假设嵌套顺序是 fi(fj(fp(x)))
那么得到的函数将是
ans =ai*(aj*(ap*x+bp)+bj)+bi
观察到与 x 有关的一项跟函数的嵌套顺序无关,所以我们只需要让后面的 ai×bj×... 最大即可。
继续假设。考虑一种简单点的情况,即当 n=3 时,三个方程编号分别是 i,j,p。
我们通过调整法证明排序策略。
假设最外层嵌套的是第 i 个方程,那么我们需要决定的就是 j,p 谁在内层的问题。
先计算出两种情况的答案,分别是 p 在内层 ai*aj*bp+ai*bj+bi 和 j 在内层 ai*ap*bj+ai*bp+bi。
化简式子,分别是 aj*bp+bj 和 ap*bj+bp。
移项,(aj−1)bp 和 (ap−1)bj
两边除过去,(aj−1)/bj 和 (ap−1)/bp
假设 (aj−1)/bj>(ap−1)/bp,那么最后的答案就是 p 在内层的答案要大于 j 在内层的答案。
所以按照 (a−1)/b 排序即可。
证毕。
仔细想想其实两种算法是一样的0v0,通过假设有限个的结果推出排序的顺序,其策略都是比较ai*bj + bi 与 aj*bi + bj 的大小关系,不过大佬继续处理把二元关系处理成了一元。