60分钟两道题,第一道树相关占30分,第二道简单数论占20分。时间分配严重不合理,第二题不到十分钟就解决了,剩下的时间都在处理第一题的compile error……咕鸽online没有错误提示,感觉和面试时候白板手写代码差不多了TvT再次让我感到ide的伟大……
challenge帮你处理题目输入输出,和在leetcode做有点相似,你只要关心主逻辑就可以了。和leetcode不一样的地方是,会把输入输出的过程给你看,毕竟你得知道输入长什么样,特别是图,会有很多种表示方法。第一题我就在这里踩了坑,没注意到边的表示不是邻接矩阵,而是拿了个vector存两个顶点,还不告诉我谁是父结点谁是子结点(如果题目其实给的数据是按照父结点子结点的顺序的话,请忽略之,脑子确实有点懵),于是sigsev了……
第一题:给一棵树,要求找到距离最近且数值互质的祖先结点。
时间空间:(不记得了……)
测试组数T:(不记得了……)
结点个数N:1<=N<=105
每个结点的值Valuei:1<=Valuei<=100
太惨了,五个样例都只过了一个……直接输入输出是不是都能拿分啊我没试过,之前也没找到这个比赛的题目信息啊(已善用搜索)
结束了还懵圈了一个小时,然后我大概意识到自己的错误,seq小的不一定是seq大的结点的祖先结点啊!感觉算法这边得针对图相关的题目查漏补缺一下了。
第二题:给三个数,类型是long long,定义一次操作是将其中两个数同时减一,但不能将任何一个数减至负数。问最大操作数是多少。
例子是2 3 4,可行的操作是
第一种:2 3 4 → 1 2 4 → 0 1 4 → 0 0 3 三次操作
第二种:2 3 4 → 2 2 3 → 2 1 2 → 1 1 1 → 0 0 1 四次操作
显然就是四次操作是最大操作数了……
看到标题里有“最大”,我还以为会用dp……
思路很明确,直接上代码吧
long long maxOpNum(long a, long b, long c) { long long x, y, z; x = max(max(a, b), c); y = min(min(a, b), c); z = a + b + c - x - y; if (x >= y + z) { return y + z; } return (x + y + z) >> 1; }
总体来说应该是不难的,但是因为各种原因,不熟练、有知识漏洞、读题做题习惯,时间不够用。练习时间还是太少了……
Anyway,加油鸭ヾ(◍°∇°◍)ノ゙