关于毕业

来源:互联网 发布:中国工业实力知乎 编辑:程序博客网 时间:2024/04/28 13:32

过去的11月份毕业季提前校招,有幸受到两家企业的青睐。
递交简历,通过笔试,再面试,而后被告知录取。因为是统一笔试,没有对不同岗位进行分卷,挑选其中算法题写完就交卷了。

算法题如下

1、2 、5三个数字组成结果为100的组合,一共有几个组合。比如100个1是一个组合;19个5和5个1是一个组合。

第一反应是循环,三个循环解决。但是根据ACM刷题经验,这道题目会有更优化算法。没有直接动笔,在试卷右边举数对题目进行分析。

设三位数字分别为x, y, z,组合结果为J,且用J100表示 “组成结果为100时的组合个数”.

先举例J15=?

x1+(7y+0z)14=15x1+(2y+2z)14=15x2+(?y+?z)13=15x3+(6y+0z)12=15x3+(1y+2z)12=15x4+(?y+?z)11=15x5+(5y+0z)10=15x5+(0y+2z)10=15x6+(?y+?z)9=15x7+(4y+0z)8=15x8+(1y+1z)7=15x9+(3y+0z)6=15x10+(0y+1z)5=15x11+(2y+0z)4=15x12+(?y+?z)3=15x13+(1y+0z)2=15x14+(?y+?z)1=15x15+(0y+0z)0=15truetruefalsetruetruefalsetruetruefalsetruetruetruetruetruefalsefalsefalsetrue123456789101112

书写过程中遗漏和重复次数较多,而且验证比较困难,斟酌之下没有继续推演。

写下如下代码

<?php$x=1;$y=2;$z=5;$j=100;$count=0;$mun=0;for($x=0;$x<=100;$x++){    for($y=0; $y<=(100-$x*$y)/2;$y++){        for($z=0;$z<=(100-$x-2*$y)/2;$z++){            if(($x+2*$y+5*$z)==100){                $mun++;            }            $count++;        }    }}echo "一共有".$mun."对<br>";echo "一共执行".$count."次";?>

交卷之后借助百度,获知正确答案。x作为三个数字中最小,变化最多的数字,不适合作为控制量。
x可以和y+z的任意结果相加,
举个例子,只要B满足y+z, A不受任何限制, 以x作为控制量,至少会有15/x+1种可能。

xA+(y+z)B=15

反向一下,

zA+(y+x)B=15

A的条件限制,必须是z的倍数,用算术表示 A/z=Int, B=15Az在这里有15/z+1的可能性
0z0+(y+x)15=151z5+(y+x)10=152z10+(y+x)5=153z15+(y+x)0=15

问题难度降低,变为3个小问题。最后一个忽视,3z情况下y+z不存在。
3Z0y+0x=0

所以z3=1

2Z0y+5x=51y+3x=52y+1x=5

所以z2=3
1Z0y+10x=101y+8x=102y+6x=103y+4x=104y+2x=105y+0x=10

所以z1=6
0Z0y+15x=151y+13x=152y+11x=153y+9x=154y+7x=155y+5x=156y+3x=157y+1x=15

所以z0=8,
结果为J15=18

中间发现一个规律, B正好和A互补, J=B+A,
Bzn的关系是B/2+1,因为y=2限制式子可能性,换句话说是B中的偶数个数+1(0在这里作为偶数)。

写出伪算法
z(n)=(n/z)z+1
J(n)=z(n)+z(n1)+..+z(0);

n = 100;z = 5;num = 0;for(int i = 0;i<=n/z;i++){    num += (i*z)/2+1;}print num;

总结

举数部分借助了答案,但整个推演过程却是自己得出的。算法其实还是看思维,哪怕一模一样的算法背后的思维是不同的。
优化算法的前提是得到基础算法,基础算法效率低下但是十分可靠,通过举数分析可得出优化算法。

原创粉丝点击