2018计蒜之道复赛-贝壳找房函数最值

原题链接

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的大小排序

原文链接(有些问题稍微修改了下)

 证明:

 假设当前有三个函数,参数分别为 ai,aj,ap 和 bi,bj,bp。

假设嵌套顺序是 fi(fj(fp(x)))

那么得到的函数将是

ans =ai*(aj*(ap*x+bp)+bj)+bi
      =ai*(aj*ap*x+aj*bp+bj)+bi
      =ai*aj*ap*x+ai*aj*bp+ai*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 的大小关系,不过大佬继续处理把二元关系处理成了一元。

猜你喜欢

转载自blog.csdn.net/yhl1999/article/details/80724671
今日推荐