这次题出的比实习招聘要好,虽然不怎么会。。笔试后感谢大佬给我讲题,在此记录下这几题,题目应该不对,题意是对的。
数字变换
输入4个数,a,b,c,d。每次可以对a,b进行同时加1,活着同时乘2. 问使得a=c,b=d的最小次数,若不能则输出-1。a,b,c,d<10^9
解
考虑同时加1不改变a和b的差,同时乘2使得a,b之差乘2. 因此根据c,d之差,找到需要乘2的次数。剩下的变换就是+1的次数。
硬币找零
你有很多硬币,价值为1,2,4,8,.. 2^k,每种价值有2个。输入n,问硬币组合成n的方案数。 例如n=6, 输出3. n<10^18
解
这里n很大,需要从硬币价值的特殊性和刚好2个入手。考虑n的二进制,dp[i][j]
表示从低位到第i位,j=0表示无进位的方案数,j=1表示有进位的方案数。
考虑第i位
|
|
魔法城市
给定一个n节点的无向图,所有节点都有通路,通路的权值在0-9。另有一个输入k,表示可以用k次魔法使k条边的权值减半,求节点0到节点1的最短路径。 n=100
解
本题的一个关键在于两两之间有通路,所以从节点0可以走1,2,3…n-1次到节点1.
dp[i][j][k]
表示第i个节点走j步到1,还可以用k次魔法。j从0到n-1.
dp[i][j][k] = dp[其它的i][j-1][讨论k]
总结
算法菜了好多。。秋招没什么动力。。还是得练算法啊:)