目录
填空题
1.有趣的数字
我们称一个数是质数,而且数位中出现了 5 的数字是有趣的。例如 5,59,457 都是有趣的,而 15, 7不是。求 1 到 100000 中有趣的数的个数。
我的做法是筛出100000内的质数,判断有没有哪一位是5
答案:3282
2. 爬楼梯
蒜头君要爬楼梯。楼梯一共有 10 层台阶。因为腿长的限制,每次最多能上 4 层台阶。但是第 5,7 层楼梯坏掉了不能踩。求上楼梯的方案数。
用f[i]表示上到第i层的方案数
特判5和7即可
答案:72
3.七巧板
求问在以下图案的大三角形内部添加五条直线最多可以将大三角形分成多少个区域。
例如下图一共有 7 个区域。
请在下图的基础上添加五条直线。
当前画一条直线可以穿过的最大数量为6,会多6块,下一次可以穿过的最大数量为7……
所以一共会增加6 + 7 + 8 + 9 + 10 = 40块
答案:47
4.苹果
有 30 个篮子,每个篮子里有若干个苹果,篮子里的苹果数序列已经给出。
现在要把苹果分给小朋友们,每个小朋友要么从一个篮子里拿三个苹果,要么从相邻的三个篮子里各拿一个苹果。
苹果可以剩余,而且不同的拿法会导致不同的答案。比如对于序列3 1 3
,可以分给两个小朋友变成0 1 0
;也可以分给一个小朋友变成2 0 2
,此时不能继续再分了。所以答案是 22 。
求问对于以下序列,最多分给几个小朋友?
我是用贪心来做的,这个是错误的,正解是dfs
暴力dfs会超时,加剪枝优化
答案:
#include<bits/stdc++.h>
using namespace std;
int ans = 0;
int a[117] = {7,2,12,5,9, 9,8,10,7,10, 5,4,5,8,4, 4,10,11,3,8, 7,8,3,2,1, 6,3,9,7,1};
int sum[117];
void dfs(int idex, int num) {
if(idex == 30) {
ans = max(ans, num);
return;
}
if(sum[idex] / 3 + num < ans) return; //剪枝优化
//不公用
dfs(idex+1, num+a[idex]/3);
//往后公用
if(idex+2 < 30) {
int min_num = min(a[idex], a[idex + 1]);
min_num = min(min_num, a[idex+2]); //共用最多能分几个
for(int k = 1; k <= min_num; k++) {
for(int i = 0; i < 3; i++) a[idex+i] -= k;
dfs(idex+1, num+a[idex]/3+k);
for(int i = 0; i < 3; i++) a[idex+i] += k;
}
}
}
int main() {
for(int i = 29; i >= 0; i--) sum[i] = sum[i + 1] + a[i];
for(int i = 0; i < 30; i++) cout << sum[i] << ' ';
dfs(0, 0);
cout << ans << endl;
return 0;
}
【解题报告】2020蓝桥杯B组模拟 计蒜客 结果填空:苹果_来老铁干了这碗代码的博客-CSDN博客
5.方阵
广场上的小朋友们排成了整齐的方阵。具体来说,我们可以把每个小朋友看做是一个点,那么小朋友们就形成了 n×n 的点阵。方阵中,小朋友 A 和小朋友 B 互相可以看见,当且仅当二人之间的连线不经过别的小朋友,且他们之间的距离不超过 k (因为太远就看不见了)。我们想知道有多少对小朋友互相可以看见。(A,B) 与 (B,A) 算同一对。
例如 n=2,k=1 时答案为 4,n=2,k=2 时答案为 6(距离为 1 的有 4 对,距离为 的有 2 对),n=3,k=2 时答案为 20 。
现在我们想要知道,当 n=1000,k=500 时的答案是多少。由于答案过大,请回答对 10^9+7 取模后的结果。
好多博客都只说需要横纵距离差的最大公约数等于1,但没说为什么,下面这个博客具体讲了,因为我现在没法画图,就直接copy了,他还写了其他题的题解,不过第四题是错的
答案:916585708
程序设计
6.寻找重复项
因为实在不会用计蒜客,也不知道怎么试对错,也不知道自己写的对不对,只能靠搜题解了
2020 蓝桥杯大学 B 组省赛模拟赛(一)F. 程序设计:寻找重复项_高自期许的博客-CSDN博客
#include <bits/stdc++.h>
using namespace std;
unordered_map<int, bool> book;
int main()
{
long long a, b, c, x = 1, y, cnt = 0;
cin >> a >> b >> c;
do {
book[x] = true;
y = (a * x + x % b) % c;
x = y;
++cnt;
}while(!book[y] && cnt <= 2000000);
if (cnt > 2000000)cout << -1 << endl;
else cout << cnt << endl;
return 0;
}
其他题目都可以看第5题的博客