20240329更新
时隔半个月,再对这次模拟赛进行下复盘总结。
第六题 最少步数
每次走3节台阶可使总步数最少,最后一步为1到3步(包括)。
即总台阶数除以三上取整为要输出的答案。
上取整公式
n / q 上取整可写为:
(n + (q - 1)) / q
#include <iostream>
using namespace std;
int n;
int main()
{
cin >> n;
cout << (n + 2) / 3;
// 直接对总台阶数除以3上取整。
return 0;
}
第七题 奇数次数
求一个仅由单个数字组成的字符串中,奇数(1,3,5,7,9)出现了多少次。
可以遍历字符串,取出每个字符,容易得出‘0’的ASCII码为偶数,故0-9的ASCII码与其自己的奇偶性相同,即对此字符与1做按位与运算,若为真,答案++,最后输出答案。
#include <iostream>
using namespace std;
string s;
int cnt;
int main()
{
cin >> s;
for (char c : s)
{
if (c & 1) cnt++;
}
cout << cnt;
return 0;
}
第八题 最大极小值与最小极大值
先输入a[0] ~ a[n - 1]。
再遍历从a[1] ~ a[n - 2],找出其中属于极大值(或极小值)的数,将其与minmax
(初始化为maxInt
)(或minmax
(初始化为minInt
))作比较,若比minmax
小(或比maxmin
大),更新minmax
(或maxmin
)。
遍历完毕后,输出答案即可。
#include <iostream>
#include <vector>
using namespace std;
int n;
int a[1010];
int main()
{
scanf("%d", &n);
for (int i = 0; i < n; i++)
scanf("%d", &a[i]);
int maxmin = -1, minmax = 100001;
for (int i = 1; i < n - 1; i++)
{
if (a[i] < a[i - 1] && a[i] < a[i + 1])
maxmin = max(maxmin, a[i]);
if (a[i] > a[i - 1] && a[i] > a[i + 1])
minmax = min(minmax, a[i]);
}
printf("%d %d\n", maxmin, minmax);
return 0;
}
第十题 台阶方案
考场上写错了,实测只能过20%的样例。
后面重写了正确代码。
q数组存走到某一级台阶的总方案数,q[0]
= 1,
dp出q[1] ~ q[n]
,第i
级的方案数q[i]
即
q[i - a] + q[i - b] + q[i - c]
#include <iostream>
using namespace std;
const int N = 1e6 + 100;
const int M = 1000000007;
int q[N], a, b, c, n;
int main()
{
cin >> n >> a >> b >> c;
q[0] = 1;
for (int i = a; i <= n; i++)
{
q[i] += q[i - a];
q[i] %= M;
if (i >= b) q[i] += q[i - b];
q[i] %= M;
if (i >= c) q[i] += q[i - c];
q[i] %= M;
}
cout << q[n] << endl;
return 0;
}
20240315更新
记录第十五届蓝桥杯模拟赛(第三期),总的感觉就是比上一次简单,但倒数第二道题没想出来,想复杂了。其它九道题尚可。
记一次草率的小练手
1.
6
2.
4186
3.
5503
4.
344
5.
171248
6.
#include <iostream>
using namespace std;
int n;
int main()
{
cin >> n;
cout << (n + 2) / 3;
return 0;
}
7.
#include <iostream>
using namespace std;
string s;
int cnt;
int main()
{
cin >> s;
for (char c : s)
{
if (c & 1) cnt++;
}
cout << cnt;
return 0;
}
8.
#include <iostream>
#include <vector>
using namespace std;
int n;
int a[1010];
int main()
{
scanf("%d", &n);
for (int i = 0; i < n; i++)
scanf("%d", &a[i]);
int maxmin = -1, minmax = 100001;
for (int i = 1; i < n - 1; i++)
{
if (a[i] < a[i - 1] && a[i] < a[i + 1])
maxmin = max(maxmin, a[i]);
if (a[i] > a[i - 1] && a[i] > a[i + 1])
minmax = min(minmax, a[i]);
}
printf("%d %d\n", maxmin, minmax);
return 0;
}
9.
10.
#include <iostream>
using namespace std;
int n;
int a, b, c;
int res;
void dfs(int x)
{
if (x == n)
{
res++;
return;
}
else if (x > n) return;
dfs(x + a);
dfs(x + b);
dfs(x + c);
}
int main()
{
cin >> n >> a >> b >> c;
dfs(0);
cout << res << endl;
return 0;
}