比赛链接:https://ac.nowcoder.com/acm/contest/3282
题目按照从易到难的顺序讲解:
A:https://ac.nowcoder.com/acm/contest/view-submission?submissionId=42570985
B:https://ac.nowcoder.com/acm/contest/view-submission?submissionId=42556087
D:https://ac.nowcoder.com/acm/contest/view-submission?submissionId=42554494
F:https://ac.nowcoder.com/acm/contest/view-submission?submissionId=42571216
G:https://ac.nowcoder.com/acm/contest/view-submission?submissionId=42570963
H:https://ac.nowcoder.com/acm/contest/view-submission?submissionId=42553629
I :https://ac.nowcoder.com/acm/contest/view-submission?submissionId=42552911
K:https://ac.nowcoder.com/acm/contest/view-submission?submissionId=42551080
K-Hello World
- 签到题
输出I Love nowcoder即可,温暖的签到题~
B-最大边长
- 简单思维题
考虑三个边长相等的正方形如何摆放在一个长方形格子里,使得边长最大,只有两种方法为最优的摆法:
至于为什么?贪心的考虑一下就画出来了
A-斐波那契
- 矩阵快速幂
典型的斐波那契数列背景
题目给出n<=1e18,暴力O(n)肯定会超时,一般选择用矩阵快速幂求解。
矩阵快速幂和快速幂实质都是简化时间复杂度,时间复杂度都是log(n)
如果对矩阵快速幂还不熟悉,建议先学习一下如何使用矩阵快速幂,学过线性代数掌握起来会快一点。
推荐一篇大佬的博客,讲解矩阵快速幂:https://zhuanlan.zhihu.com/p/42639682
学会了使用矩阵快速幂,我们就可以写出递推公式解出来这一道题
斐波那契数列前n项平方和的通项公式为:
拿小本本记下来~
证明前n项平方和公式:https://blog.csdn.net/lanchunhui/article/details/51840616
I-小小小马
- 简单思维题
也可以直接画出来推导出来规律,注意当n=1且m=1的时候,特判一下,我第一发没特判就wa了~
D-3的倍数
- dfs枚举
直接dfs枚举每一种情况,考虑当前字符串取还是不取。
当枚举到第n+1位时,如果当前所有的字符都是3的倍数,更新最大值答案~
H-好点
- 排序枚举
一个好点即这个点的右上角不存在其余的点,听起来比较别扭,如图所示:
图1,一共有3个好点,因为每一个点的右上角都没有其余的点,所以3个点都是好点。
图2,一共有1个好点(最右上角的点),其余的点。
所以我们想到一个简单的做法,先按照横坐标从小到大排序,从最右边的点往左遍历,标记当前遍历所有的点的最大纵坐标为MAXy~
如果遍历到(x1,y1)且 y1 < MAXy ,这个点肯定不是好点,因为肯定存在右边的一个点的纵坐标大于y1
如果遍历到(x2,y2)且 y2 > MAXy ,这个点肯定是好点,原因和(x1,y1)相反,接着更新MAXy = y2
F-进制转换
- 大数进制转换
附上原题链接:https://nanti.jisuanke.com/t/42389
c++没存板子,不会写真香的python
还是用java大数写吧~
G-快乐风男
- 树状数组或者STL
题目让输出最长的上升子序列的下标,而且下标字典序最小。
我是用STL写的,树状数组也是可以的
我们先将每一个位置能在a数组构成的最长的上升自序列长度存放到一个b数组里
比如长度为7的a数组:1 7 8 9 3 4 5,对应的b数组就是1 2 3 4 2 3 4,代表第i个数能组成的最长的上升子序列的长度
将b数组数值相同的数在a数组的下标存放到一个set数组里,就成为了
set[1] = {1}
set[2] = {2,5}
set[3] = {3,6}
set[4] = {4,7}
然后我们从后往前遍历set,找到下标最小且原数组数值最大的数(不好理解,看代码~),最后的答案就是 1 2 3 4 ~