OO第一单元优化博客

OO第一单元优化博客

第一次作业:

合并同类项+提正系数项+优化系数指数0/1=满分

第二次作业:

初始想法

一开始是想以\(sin(x)​\)\(cos(x)​\)的指数作为坐标,在图上画出来就可以发现,两个坐标分别为\((a,b+2),(a,b+2)​\)的点能够合成\((a,b)​\)的点。

现在我们推广开来,假设有系数分别为为1,2,1的三个点\((a,b+4),(a+2,b+2),(a+4,b)\)即可合成一个\((a,b)\),即,若一排连续的\(n\)个点系数满足杨辉三角第\(n\)行也即组合数,那么他们就能合成一个点。

当坐标即指数和比较小时,可以将所有点先反向拆分到坐标和最大那一排,再用若干次组合数去凑,次数小于\(n-1\)次,项数就会减少。

但这种算法局限性太大,不好实现,面对指数较大的数据只能分局部做。

自暴自弃

既然无法贪心,只好搜索。

dfs,每次找到可合并的两个项去合并,然后回溯,不断记录最短答案,其中,两个项合并的次数(即合并之后的系数)要满足至少要用完其中一个项。

改完dfs发现要T(爆栈),就把每次dfs前的答案扔进set判重,即记忆化。

合并的话一开始只考虑了\(sin(x)^2+cos(x)^2=1\)然后用\(1-sin(x)^2=cos(x)^2\)以拆分常数项 和不含\(sin(x)\)\(cos(x)\)的项来体现。后来发现速度很快但效果不好。

在队友丁总对我的指导下,我把\(1-sin(x)^2=cos(x)^2\)放进了dfs,成为合并两个项的新选择。

关于极端数据爆栈,卡住dfs次数和程序运行时间即可。最终性能分满分。

正常随机数据或项数不多的数据可以随便跑完,评论区里面的数据应该都能搜完。

欢迎大佬们批评指正,本数学弱鸡,码力选手只能想到这种暴力做法,写了快10k的优化类,累死。

第三次作业:

使用前面的架构,用一个三元组表示一个乘积项,分别表示系数、x的指数、一个常量String。对于每个表达式,在求导结束后,对它的原函数和导函数的set做一次\(O(n^2)\)的合并,合并x的系数和常量String都相等的项。原本输出就不含系数指数为0/1的,而且没有一个多余的括号。

实际测试发现,对于随机出来的含嵌套的数据表现非常好,一般能达到不合并的15%左右,比其他一些架构的优化更有效,性能分几乎满分。无奈此次强测数据过于水,无法体现此架构的优势,惜拿96.2分。

posted @ 2019-03-30 21:43  HugeGun  阅读(467)  评论(0编辑  收藏  举报