2022蓝桥杯C++B组省赛题解(个人题解,持续更新中)

题目一

九进制正整数(2022) 转换成十进制等于多少?

这是一道结果填空的题,你只需要算出结果后提交即可。

本题的结果为一个整数,在提交答案时只输出这个整数,输出多余的内容将无法得分。

这题需要掌握不同进制之间的转换,也可以在纸上直接进行计算

1478

题目二

小明特别喜欢顺子。顺子指的就是连续的三个数字:123、456 等。

顺子日期指的就是在日期的 yyyymmdd 表示法中,存在任意连续的三位数是一个顺子的日期。

例如20220123 就是一个顺子日期,因为它出现了一个顺子:123;

本题顺子的定义:i j k 是一个顺子,满足 i+1=j、j+1=k、i≥0

而20221023 则不是一个顺子日期,它一个顺子也没有。

小明想知道在整个2022年份中,一共有多少个顺子日期。

这是一道结果填空的题,你只需要算出结果后提交即可。

本题的结果为一个整数,在提交答案时只输出这个整数,输出多余的内容将无法得分。

14

题目三

小明决定从下周一开始努力刷题准备蓝桥杯竞赛。

他计划周一至周五每天做 a 道题目,周六和周日每天做 b 道题目。

请你帮小明计算,按照计划他将在第几天实现做题数大于等于 n 题?

输入一行包含三个整数a, b 和n.

50% 的评测用例:1 ≤ a, b, n ≤ 10^6;

100% 的评测用例:1 ≤ a, b, n ≤ 10^18。

输入样例

10 20 99

输出样例

8

AC代码

#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
int main()
{
    ll a, b, n, sum,y,day;
    cin >> a >> b >> n;
    sum = a * 5 + b * 2;//算出一周能做多少题目
    day = n / sum * 7;
    y = n % sum;//余下的不够一周的题目数量
    ll k[7] = { a,a,a,a,a,b,b };//数组不要用int型,我第一次做问题就在这
    if (y != 0)
    {
        for (int i = 0; y > 0; i++)
        {
            y -= k[i];
            day++;
        }
    }
    cout << day;
}

题目四

爱丽丝要完成一项修剪灌木的工作。

有 N 棵灌木整齐的从左到右排成一排。

爱丽丝在每天傍晚会修剪一棵灌木,让灌木的高度变为 0 厘米。

爱丽丝修剪灌木的顺序是从最左侧的灌木开始,每天向右修剪一棵灌木。

当修剪了最右侧的灌木后,她会调转方向,下一天开始向左修剪灌木。

直到修剪了最左的灌木后再次调转方向。然后如此循环往复。

灌木每天从早上到傍晚会长高 1 厘米,而其余时间不会长高。

在第一天的早晨,所有灌木的高度都是 0 厘米。爱丽丝想知道每棵灌木最高长到多高。

一个正整数N ,含义如题面所述。

30%的测试数据:1<N≤10;

100%的测试数据:1<N≤10000。

输入样例

3

输出样例

4
2
4

AC代码

#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
    int N;
    cin >> N;
    for (int i = 1; i <= N; i++)
    {
        int f = i;
        int s = (i - 1) * 2;
        int t = (N - i) * 2;
        int k = max(max(f, s), t);//选出三种情况下的最大值
        cout << k << endl;
    }
    return 0;
}

题目五

进制规定了数字在数位上逢几进一。

X 进制是一种很神奇的进制,因为其每一数位的进制并不固定!

例如说某种X 进制数,最低数位为二进制,第二数位为十进制,第三数位为八进制:

则 X 进制数321 转换为十进制数为65。65=3*(2*10)+2*(2)+1*(1)。

现在有两个 X 进制表示的整数 A 和 B,但是其具体每一数位的进制还不确定。

只知道 A 和 B 是同一进制规则,且每一数位最高为 N 进制,最低为二进制。

请你算出 A − B 的结果最小可能是多少。

请注意,你需要保证 A 和 B 在 X 进制下都是合法的,即每一数位上的数字要小于其进制。

输入格式

第一行一个正整数 N,含义如题面所述。

第二行一个正整数 Ma,表示 X 进制数 A 的位数。

第三行 Ma 个用空格分开的整数,表示 X 进制数 A 按从高位到低位顺序各个数位上的数字在十进制下的表示。

第四行一个正整数 Mb,表示 X 进制数 B 的位数。

第五行 Mb 个用空格分开的整数,表示 X 进制数 B 按从高位到低位顺序各个数位上的数字在十进制下的表示。

请注意,输入中的所有数字都是十进制的。

30%的测试数据:2≤N≤10,1≤Ma,Mb≤8。

100%的测试数据:2≤N≤1000,1≤Ma,Mb≤100000,B≤A。

输出格式

输出一行一个整数,表示X 进制数A − B 的结果的最小可能值转换为十进制后再模1000000007 的结果。

输入样例

11
3
10 4 0
3
1 2 0

输出样例

94

AC代码

#include<iostream>
#include<algorithm>
using namespace std;

typedef long long ll;
const int N = 100005, mod = 1000000007;
int a[N], b[N];
int main()
{
    int n, ma, mb, m;
    int ans = 0;
    cin >> n;
    cin >> ma;
    for (int i = ma - 1; i >= 0; i--)
        cin >> a[i];
    cin >> mb;
    for (int i = mb - 1; i >= 0; i--)
        cin >> b[i];
    m = max(ma, mb);
    for (int i = m - 1; i >= 0; i--)
    {
        ans = (ans * (ll)max({ 2, a[i] + 1, b[i] + 1 }) + a[i] - b[i]) % mod;
    }
    cout << ans;
    return 0;
}

题目六

给定一个 N × M 的矩阵A,请你统计有多少个子矩阵(最小 1 × 1,最大 N × M) 满足:

子矩阵中所有数的和不超过给定的整数K?

输入格式

第一行包含三个整数N, M 和K.

之后 N 行每行包含 M 个整数,代表矩阵A.

30%的测试数据:1≤N,M≤20;

70%的测试数据:1≤N,M≤100;

100%的测试数据:1≤N,M≤500;0≤Aij≤1000;1≤K≤250000000。

输出格式

一个整数代表答案。

输入样例

3 4 10
1 2 3 4
5 6 7 8
9 10 11 12

输出样例

19

AC代码

#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N = 510;
int a[N][N];
int main()
{
    int n, m, k;
    ll ans = 0;
    cin >> n >> m >> k;
    for(int i=1;i<=n;i++)
        for (int j = 1; j <= m; j++)
        {
            cin >> a[i][j];
            a[i][j] += a[i - 1][j];
        }
    for(int i=1;i<=n;i++)
        for(int j=i;j<=n;j++)
            for (int l = 1, r = 1, sum = 0; r <= m; r++)
            {
                sum += a[j][r] - a[i - 1][r];
                while (sum > k)
                {
                    sum -= a[j][l] - a[i - 1][l];
                    l++;
                }
                ans += r - l + 1;
            }
    cout << ans;
    return 0;
}