三道题拿分都不难,不过这个在线网页撸代码的熟练度还得再提高一下(做的时候C的调试有时候不灵光, Python编辑器的自动缩进功能肯定有bug...)。
第一题是给四个数A,B,C,D, 给两种变换操作: 第一种: A, B同时+1, 第二种, A, B同时乘2。问最少几次操作后可以把A和B同时恰好变换成C, D, 没有变换方法就输出-1。
这道题应该是可以推数学表达式的,应该存在O(logn)甚至O(1)的方法。不过考试拿分起见,就先写一个dfs模拟。
具体写法就是dfs(A_tmp, B_tmp, level),递归调用dfs(A_tmp + 1, B_tmp + 1, level + 1) 和dfs(A_tmp * 2, B_tmp * 2, level + 1)。全局维护一个最小操作数,并做好剪枝工作,就可以顺利拿分了。
第二题,题目就是有[1,1,2,2,4,4,..., 2^18, 2^18] ,即从2^0到2^k恰好每个数有两个的可用因子,给一个目标整数N,问从这些因子里部分累加,可以凑成N的总的组合数量。
这题应该算是整数划分题,不太明白的同学可以搜搜“整数划分”或者看郭炜老师的慕课的DP部分找找感觉。
但是...我也对这个题型有点生疏了,就想先用dfs试试看。
同样,为了拿分,就先生成一个长度38的数组arr,里面放[1,1,2,2,...2^18, 2^18]。需要指出的是C语言里这里要用long long。
然后做dfs模拟,dfs(i)代表取arr[i]作为因子,全局维护一个cntTmp,调用就加return前减。当cntTmp< target(目标和)时遍历dfs(i + 1) 到dfs(37)。
此外还需要记录dfs路径,构造一个哈希函数,做哈希和校验,以防止dfs搜出重复路径。
同样,做好剪枝工作,复杂度看着很高啊O(2^(2k))?(是不是啊同志们,这里我没把握)。。。(k有18也太高了)
然后我发现我的页面的debug系统挂了,输出永远是空,我觉得服务器那边一直就只收到了一个默认代码,这种的:
int main() {return 0;}
Ctrl+F5都救不回来。。。
第三题,给了一个图。求节点0到节点1的最短路。多加了了一个变量k(打对折的机会),意思是在每次走一个edge的时候有机会把edge的cost减半,共k次机会。
那么维护的状态cost[i]就变成了cost[i][j],意思是到达i且花费了j次打折机会的最小cost。
本来想快速写一个Bellman-Ford朴素最短路过样例再说,复杂度在O(k * n^2)。
无奈在第二题用时太长了,导致这题只留了10分钟,没有成功写出能过样例的代码。
最后,祝大家撸题愉快,找工作顺利。
就这样,以上。