• 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分。

  • 相关阅读:
    PAT1092:To Buy or Not to Buy
    PAT1027:Colors In Mars
    PAT1099:Build A Binary Search Tree
    PAT1064: Compelte Binary Search Tree
    PAT1008:Elevator
    TP5整合 WorkerMan 以及 GatewayWorker
    ThinkPHP5通过composer安装Workerman安装失败问题
    浏览器控制台
    webpack线上和线下模式
    PHP读取文件夹目录,按时间排序,大小排序,名字排序
  • 原文地址:https://www.cnblogs.com/HugeGun/p/10629177.html
Copyright © 2020-2023  润新知