2018年蓝桥杯B组C/C++决赛题解

2018年第九届蓝桥杯B组C/C++决赛题解

点击查看2018年蓝桥杯B组C/C++决赛题目(不含答案)

1.换零钞 ok

枚举

设x表示1元钱的个数,y表示2元钱的个数,z表示5元钱的个数
x+210y+5y == 200,求x+y+z的最小值

2.激光样式 ok

思路1:dfs搜索
每个位置两种情况:开激光(在前一个激光没打开的情况下)、不开激光

思路2:dp动态规划思想
dp[i] 表示前i个激光灯的方案数
状态转移方程:dp[i] = dp[i-1] + dp[i-2] //当前方案数 = 不开前一个灯时的方案数(dp[i-2]) + 开前一个灯时的方案数(dp[i-1])
也就是斐波那契数列了。

3.格雷码 ok

二进制问题,lowbit函数 x & -x 找到末尾为1的位置

4.调手表 ok

bfs搜索
任意数调到任意数,就等于从0开始调到n-1的过程中的最大值
bfs搜索:每个状态两种情况 +1秒 +k秒,第一次到达的状态就是最优解;vis数组作标记,以确保后面不能再更新这个状态

5. 搭积木 0%

dp
不会

6.矩阵求和 40%

暴力还是能过40%的数据点

拿满分涉及数论的知识点
欧拉函数:(求[1,p)内与p互质数的个数的函数)
欧拉线性筛,求欧拉函数
我们需要求n以内一共有几个k*k(1<=k<=n),比如样例中有几个1 几个4 几个9;也就是说gcd(i,j)=k的(i,j)共有多少对,可以转化为n/k以内有几对i和j的gcd(i,j)=1,这样就可以用欧拉筛法求一下欧拉函数(n/k内有多少个数与i互质),然后前缀和就是满足条件的对数,然后求总和
参考:https://cloud.tencent.com/developer/article/1200020
参考:http://www.cnblogs.com/8023spz/p/10761240.html

原文地址:https://www.cnblogs.com/fisherss/p/10850655.html