比赛链接: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,m>=3 且 m,n不同时为3时,便可遍历所有的点,我们可以直接dfs打表扫一遍发现规律。

也可以直接画出来推导出来规律,注意当n=1且m=1的时候,特判一下,我第一发没特判就wa了~

D-3的倍数

  • dfs枚举
题目给出n<=15,枚举所有情况时间复杂度为2^15 = 32768。

直接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 ~