2022年4月第十三届蓝桥杯C/C++程序设计A组(省赛)试题及题解

2023-10-27

试题A:裁纸刀

在这里插入图片描述

答案为 n ∗ m − 1 + 4 n*m-1+4 nm1+4

443

试题B:灭鼠先锋

在这里插入图片描述

LLLV

试题C:求和

在这里插入图片描述

预计得分100%

思路:维护一个前缀 s u m sum sum即可。

总时间复杂度 O ( n ) O(n) O(n)

参考代码:

#include <bits/stdc++.h>
using namespace std;

const int N = 2e5 + 5;

int a[N];

void solve()
{
    int n;
    scanf("%d", &n);
    long long ans = 0, sum = 0;
    for (int i = 1; i <= n; i++)
    {
        scanf("%d", &a[i]);
        ans += sum * a[i];
        sum += a[i];
    }
    cout << ans << endl;
}
int main()
{
    solve();
    return 0;
}

试题 D: 选数异或

**在这里插入图片描述**

预计得分100%

对于每个位置 i i i ,设 y = a [ i ] y = a[i] y=a[i] ^ x x x,找到最近的一个 y y y的下标 i d x idx idx,记作 b [ i ] b[i] b[i]。再用线段树维护 b b b数组的区间最大值 m a x x maxx maxx,如果 m a x x > = L maxx >= L maxx>=L,那么为 y e s yes yes

总时间复杂度 O ( n l o g n ) O(nlogn) O(nlogn)

参考代码:

#include <bits/stdc++.h>
using namespace std;

const int N = 3e5 + 5;

int a[N], b[N];

struct node
{
    int l, r, val, maxx;
} tr[N * 4];

void pushup(int k) { tr[k].maxx = max(tr[k * 2].maxx, tr[k * 2 + 1].maxx); }
void build(int k, int l, int r)
{
    tr[k].l = l;
    tr[k].r = r;
    if (tr[k].l == tr[k].r)
    {
        tr[k].val = tr[k].maxx = b[l];
        return;
    }
    int mid = l + r >> 1;
    build(k * 2, l, mid);
    build(k * 2 + 1, mid + 1, r);
    pushup(k);
}

int query(int k, int l, int r)
{
    if (tr[k].l == l && tr[k].r == r)
        return tr[k].maxx;
    int mid = tr[k].l + tr[k].r >> 1;
    if (r <= mid)
        return query(k * 2, l, r);
    else if (l > mid)
        return query(k * 2 + 1, l, r);
    else
        return max(query(k * 2, l, mid), query(k * 2 + 1, mid + 1, r));
}

void solve()
{
    int n, m, x;
    scanf("%d %d %d", &n, &m, &x);
    for (int i = 1; i <= n; i++)
        scanf("%d", &a[i]);
    map<int, int> last;
    for (int i = 1; i <= n; i++)
    {
        int y = a[i] ^ x;
        if (!last.count(y))
            b[i] = -1;
        else
            b[i] = last[y];
        last[a[i]] = i;
    }
    build(1, 1, n);
    while (m--)
    {
        int l, r;
        scanf("%d %d", &l, &r);
        int maxx_pos = query(1, l, r);
        puts(maxx_pos >= l ? "yes" : "no");
    }
}

int main()
{
    solve();
    return 0;
}

试题 E: 爬树的甲壳虫

在这里插入图片描述

暂时不会。

试题 F: 青蛙过河

在这里插入图片描述

2022.4.25 UPDATE:少了一个语句,已修正

预计得分100%

二分经典题改编题,一眼二分,check有点难写。

check思路:

可以令 d p [ i ] dp[i] dp[i]表示跳到第 i i i个石头的最大次数。
把最后 m i d mid mid个石头的 d p [ i ] dp[i] dp[i]加起来, s u m > = 2 ∗ x sum>= 2*x sum>=2x即合法。

总时间复杂度 O ( n l o g n ) O(nlogn) O(nlogn)

参考代码:

#include <bits/stdc++.h>
using namespace std;

const int N = 3e5 + 5;
int a[N];

long long dp[N];
// dp[i]表示最多能跳到位置i dp[i]次

int n, x;
bool check(int mid)
{
    long long sum = 0;
    for (int i = 1; i <= mid; i++) //前mid个都可以
        dp[i] = a[i];
    int l = 1;
    for (int i = mid + 1; i <= n; i++)
    {
        while (i - l > mid)//控制跳跃距离。
            ++l;
        dp[i] = 0;
        while (dp[i] < a[i] && l < i)
        {
            if (dp[l] + dp[i] <= a[i])
            {
                dp[i] += dp[l];
                dp[l] = 0;
                ++l;
            }
            else
            {
                dp[l] -= a[i] - dp[i];
                dp[i] = a[i];
            }
        }
    }
    long long ans = 0;
    int L = n - mid + 1;
    for (int i = L; i <= n; i++)
        ans += dp[i];
    return ans >= 2 * x;
}

void solve()
{
    scanf("%d %d", &n, &x);
    --n;
    for (int i = 1; i <= n; i++)
        scanf("%d", &a[i]);
    int l = 1, r = n, ans = n + 1;
    while (l <= r)
    {
        int mid = l + r >> 1;
        if (check(mid))
        {
            ans = mid;
            r = mid - 1;
        }
        else
            l = mid + 1;
    }
    printf("%d\n", ans);
}

int main()
{
    solve();
    return 0;
}

试题 G: 最长不下降子序列

在这里插入图片描述

预计得分10% ~ 30%

暴力思路:

枚举修改位置,二分法 O ( n l o g n ) O(nlogn) O(nlogn)求最长不下降子序列,(跳过中间那段长度为 k k k的数组)

总时间复杂度 O ( n 2 l o g n ) O(n^2logn) O(n2logn)

参考代码:

#include <bits/stdc++.h>
using namespace std;

const int N = 1e5 + 5;

int a[N], dp[N];
int n, k;
int LIS(int L, int R) //二分求LIS
{
    int len = 0;
    dp[len] = -0x3f3f3f3f;
    for (int i = 1; i <= n; i++)
    {
        if (i == L) //跳过k个
        {
            i = R;
            continue;
        }

        if (a[i] >= dp[len])
        {
            ++len;
            dp[len] = a[i];
        }
        int p = upper_bound(dp + 1, dp + 1 + len, a[i]) - dp;
        dp[p] = a[i];
    }
    return len;
}
void solve()
{
    scanf("%d %d", &n, &k);
    for (int i = 1; i <= n; i++)
        scanf("%d", &a[i]);
    if (n - 1 <= k)
    //修改k个必然能全部满足
    {
        printf("%d\n", n);
        return;
    }
    int ans = k + 1;
    for (int i = 1; i + k - 1 <= n; i++)
        ans = max(ans, k + LIS(i, i + k - 1));
    printf("%d\n", ans);
}

int main()
{
    solve();
    return 0;
}

试题 H: 扫描游戏

在这里插入图片描述

预计得分10% ~ 30%

暴力思路:

极角排序。之后每次暴力扫描,循环直到扫描不到物品。

总时间复杂度 O ( n 2 ) O(n^2) O(n2)

参考代码:

#include <bits/stdc++.h>
using namespace std;

const int N = 3e5 + 5;
const int INF = 0x3f3f3f3f;
struct node
{
    long long x, y, z, id;
    double theta;
    bool operator<(const node &tmp) const { return theta < tmp.theta; }
};

vector<node> vec;
int out[N];
node tmp;
void solve()
{
    int n;
    long long L;
    scanf("%d %lld", &n, &L);
    for (int i = 1; i <= n; i++)
    {
        out[i] = -1;
        tmp.id = i;
        scanf("%lld %lld %lld", &tmp.x, &tmp.y, &tmp.z);
        tmp.theta = atan2(tmp.y, tmp.x);
        vec.push_back(tmp);
    }
    sort(vec.begin(), vec.end());
    int len = (int)vec.size();
    int p = -1;
    for (int i = len - 1; i >= 0; i--)
    {
        if (vec[i].x >= 0)
        {
            p = i;
            break;
        }
    }
    if (p == -1)
    {
        for (int i = len - 1; i >= 0; i--)
        {
            if (vec[i].y <= 0)
            {
                p = i;
                break;
            }
        }
    }

    if (p == -1)
        p = (int)vec.size() - 1;

    vector<node> tmp = vec;
    vec.clear();
    for (int i = p; i >= 0; i--)
        vec.push_back(tmp[i]);
    for (int i = (int)tmp.size() - 1; i > p; i--)
        vec.push_back(tmp[i]);
    int rk = 0, sum = 0;
    node pre;
    pre.theta = INF;
    while (1)
    {
        vector<node> now;
        int m = vec.size();
        for (int i = 0; i < m; i++)
            if (vec[i].x != INF)
                now.push_back(vec[i]);
        m = now.size();
        bool flag = 0;
        for (int i = 0; i < m; i++)
        {
            if (L * L >= now[i].x * now[i].x + now[i].y * now[i].y)
            {
                L += now[i].z;
                now[i].x = INF; //标记
                flag = 1;
                if (fabs(now[i].theta - pre.theta) <= 1e-6)
                    out[now[i].id] = rk;
                else
                {
                    rk = sum + 1;
                    out[now[i].id] = rk;
                }
                sum++;
                pre = now[i];
            }
        }
        if (!flag)
            break;
        vec = now;
    }
    for (int i = 1; i <= n; i++)
        printf("%d%c", out[i], i == n ? '\n' : ' ');
}
int main()
{
    solve();
    return 0;
}

试题 I: 数的拆分

在这里插入图片描述

预计得分10%

暴力思路:筛出所有质因子,不能有出现次数只有一次的质因子,并且最多有两个出现次数为奇数次的质因子(出现偶数次只需均分给 x 1 x_1 x1 y 1 y_1 y1

总时间复杂度 O ( t s q r t ( n ) ) O(tsqrt(n)) O(tsqrt(n))

参考代码:

#include <bits/stdc++.h>
using namespace std;

bool check(long long x)
{
    map<int, int> mp;
    for (int i = 2; i * i <= x; i++)
    {
        if (x % i == 0)
            while (x % i == 0)
            {
                x /= i;
                mp[i]++;
            }
    }
    if (x >= 2)
        mp[x]++;
    int odd = 0, flag = 0;
    for (auto it : mp)
    {
        if (it.second == 1)
            return 0;
        if (it.second & 1)
            odd++;
        if (it.second >= 2)
            flag = 1;
    }
    return odd <= 2;
}
void solve()
{
    int t;
    scanf("%d", &t);
    while (t--)
    {
        long long x;
        scanf("%lld", &x);
        puts(check(x) ? "yes" : "no");
    }
}

int main()
{
    solve();
    return 0;
}

试题 J: 推导部分和

在这里插入图片描述

暂时不会。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

2022年4月第十三届蓝桥杯C/C++程序设计A组(省赛)试题及题解 的相关文章

  • 蓝桥杯 题库 简单 每日十题 day2

    01 卡片 题目描述 本题为填空题 只需要算出结果后 在代码中使用输出语句将所填结果输出即可 小蓝有很多数字卡片 每张卡片上都是数字 0 到 9 小蓝准备用这些卡片来拼一些数 他想从 1 开始拼出正整数 每拼一个 就保存起来 卡片就不能用来
  • Acwing 842. 排列数字

    dfs int u 搜索第u个位置上可以放哪个数字 include
  • 蓝桥杯 辗转相除法---求最大公约数

    1 例子 例如 求 319 377 319 377 0 余319 319 377 377 319 377 319 1 余58 377 319 319 58 319 58 5 余29 319 58 58 29 58 29 2 余0 58 29
  • 洛谷-【入门4】数组

    1 小鱼比可爱 题目描述 人比人 气死人 鱼比鱼 难死鱼 小鱼最近参加了一个 比可爱 比赛 比的是每只鱼的可爱程度 参赛的鱼被从左到右排成一排 头都朝向左边 然后每只鱼会得到一个整数数值 表示这只鱼的可爱程度 很显然整数越大 表示这只鱼越可
  • 第五届蓝桥杯—— 基础练习:数列特征

    问题描述 给出n个数 找出这n个数的最大值 最小值 和 输入格式 第一行为整数n 表示数的个数 第二行有n个数 为给定的n个数 每个数的绝对值都小于10000 输出格式 输出三行 每行一个整数 第一行表示这些数中的最大值 第二行表示这些数中
  • 蓝桥杯单片机14届省赛解析(个人)

    下面记录一下自己这届省赛比赛时的思路 不太会写作文 比较口语化 而且一些看法仅仅是我个人观点 赛后我还没有看过任何讲解或例程 可能会有很多理解不对的地方希望大家能够指出一起交流 一 硬件框图 往届省赛基本上都是考两个外设 这次一看硬件框图就
  • Python蓝桥杯 基础练习 十六进制转八进制

    def huan n n format int n 16 o print n x int input for i in range 1 x 1 n input huan n format o 将数据格式化为八进制 int n 16 返回字符
  • 蓝桥杯单片机第14届省赛客观题目+程序题目+程序题参考答案

    目录 客观题题目 程序题题目 程序题参考答案 main h main c Init h Init c SMG h SMG c DSQ h DSQ c YanShi h YanShi c JZKey h JZKey c ds1302 h ds
  • 2018年第九届蓝桥杯C/C++A组省赛 题面&部分题解

    首先 原题 链接 https pan baidu com s 1UzRN6Mf2Dwp0263F MMESg 密码 2ryh 第一题 标题 分数 1 1 1 2 1 4 1 8 1 16 每项是前一项的一半 如果一共有20项 求这个和是多少
  • 过河卒 蓝桥杯 755

    题目描述 如图 A 点有一个过河卒 需要走到目标 B 点 卒行走规则 可以向下 或者向右 同时在棋盘上的 C 点有一个对方的马 该马所在的点和所有跳跃一步可达的点称为对方马的控制点 例如上图 C 点上的马可以控制 99 个点 图中的 P1
  • 第十四届蓝桥杯程序设计C++B组 (详细图解+保姆级注释)

    0 写在前面 本届CB组题目难度较往年整体提升了一些 考察知识点全面 题目质量很高 推荐备赛蓝桥杯或感兴趣的同学深入研究本套题 废话不多说 直接上干货 一 冶炼金属 签到题难度 考察数论分块知识or二分 有部分同学可能知道下取整的定义 但是
  • 蓝桥杯C/C++百校真题赛(3期)Day3(考勤刷卡、最大和)

    Day3 Q1 考勤刷卡 Q2 最大和 Q1 考勤刷卡 问题描述 小蓝负责一个公司的考勤系统 他每天都需要根据员工刷卡的情况来确定 每个员工是否到岗 当员工刷卡时 会在后台留下一条记录 包括刷卡的时间和员工编号 只 要在一天中员工刷过一次卡
  • c++类和对象--封装--属性和行为做整体

    封装的意义 1 将属性和行为当做一个整体来表现对象 类中的属性和行为统称为成员 属性又叫成员属性或成员变量 行为又叫成员函数或成员方法 案例 设计一个圆类 求圆的周长 include
  • 每日一练-仓库日志

    仓库日志 题目描述 解题思路 Python源码 Summary Date 2023年1月9日 Author 小 y 同 学 Classify 蓝桥杯每日一练 Language Python 题目描述 题意 M海运公司最近要对旗下仓库的货物进
  • 2023蓝桥杯python 组试题A:2023

    题目 请求出在 12345678 至 98765432 中 有多少个数中完全不包含 2023 完全不包含 2023 是指无论将这个数的哪些数位移除都不能得到 2023 例如 20322175 33220022 都完全不包含 2023 而 2
  • 2022年第十四届蓝桥杯模拟赛【核酸日期】C语言详解

    目录 题目 思路 代码实现 题目 核酸日期 问题描述 如果周一做核酸 周二显示核酸天数为 1 天 周三显示 2 天 以此类推 周六显示 5 天 周日显示 6 天 小蓝在某一天做了一次核酸 请问他的核酸显示为几天 已知做核酸和查看核酸不是在同
  • 七段码(建图+搜索+并查集)

    思路 step1 邻接表建图 相邻为1 不相邻为0 题目就等价为在图中求连通子图的个数 step2 深度搜索每条边 并存储下来 step3 对选择的边用并查集保存下来 然后看father i i的个数 等于1 表示连通 否则表示不连通 易错
  • 蓝桥杯 填字母游戏(博弈论)

    小明经常玩 LOL 游戏上瘾 一次他想挑战K大师 不料K大师说 我们先来玩个空格填字母的游戏 要是你不能赢我 就再别玩LOL了 K大师在纸上画了一行n个格子 要小明和他交替往其中填入字母 并且 1 轮到某人填的时候 只能在某个空格中填入L或
  • 【快速选择算法】O(n)时间复杂度

    快速选择的期望时间复杂度为O n 最坏时间复杂度为O n 2 当每次划分只划分为n 1个和1个时 由于划分时间复杂度为O n 最坏时间复杂度为O n 2 void quickselect vector
  • 试题 B: 顺子日期

    问题描述 小明特别喜欢顺子 顺子指的就是连续的三个数字 123 456 等 顺子日 期指的就是在日期的 yyyymmdd 表示法中 存在任意连续的三位数是一个顺 子的日期 例如 20220123 就是一个顺子日期 因为它出现了一个顺子 12

随机推荐

  • 通过App的演示深入理解区块链运行原理

    下载安装 如果没有安装nodejs 需要先安装 nodejs Clone this repository git clone https github com seanseany blockchain cli Go into the rep
  • 源码进阶之线程池

    写在前面 上次学习了多线程 了解了线程的概念和作用 学习了线程的创建方式 工作模式和一些重要的方法 当我们使用线程中 创建 销毁线程伴随着系统开销 过于频繁的创建 销毁线程 就会很大程度上影响处理效率 那么此时我们就引入了线程池的概念 即为
  • C语言【猜数字游戏】详解

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 前言 一 猜数字游戏是什么 二 使用步骤 1 首先应该打印菜单 2 打印我们的game 函数来实现我们的游戏具体逻辑 总结 前言 本文详细介绍了猜数字游戏的具体实现
  • Android Studio升级Gradle Plugin升级导致项目运行失败问题

    背景 错误 升级Android Studio 旧项目无法运行 奇奇怪怪什么错误都有 例如 java lang IllegalAccessError class org gradle api internal tasks compile pr
  • 100天精通Python(数据分析篇)——第68天:Pandas数据清洗函数大全(判断缺失、删除空值、填补空值、替换元素、分割元素)

    文章目录 一 drop 删除指定行列 1 删除指定行 2 删除指定列 二 del 删除指定列 三 isnull 判断是否为缺失 1 判断是否为缺失 2 判断哪些列存在缺失 3 统计缺失个数 四 notnull 判断是否不为缺失 五 drop
  • Mac上如何正确的安装 Android Studio

    1 下载 Android Studio 官方下载地址 2 预处理 可选 如果事先下载过 Android Studio 则需要在终端执行以下命令 卸载主程序 rm Rf Applications Android Studio app rm R
  • window jenkins + 加固 & mac 进行jenkins + fastlane + pod + git环境搭建 一

    非常炒蛋的操作 但是必须搞 最心累就是360有个版本问题 严重拖了后腿 最后提示 权限不足 是cli版本内部问题 主要思想 jenkins 进行搭建支持window linux 等系统部署完毕后 配置git或者svn的路径 进行构建后 进行
  • R语言 lightgbm 算法优化:不平衡二分类问题(附代码)

    来源 大数据文摘 本文约10000字 建议阅读10分钟本文以kaggle比赛的数据为例 为你讲解不平衡二分类问题的解决方法 本案例使用的数据为kaggle中 Santander Customer Satisfaction 比赛的数据 此案例
  • c语言作业 求1到n的阶乘和,C语言,计算1到n的阶乘求和问题

    C语言 计算1到n的阶乘求和问题以下文字资料是由 历史新知网www lishixinzhi com 小编为大家搜集整理后发布的内容 让我们赶快一起来看一下吧 C语言 计算1到n的阶乘求和问题 在for n gt 1 n 里面对b进行初始化
  • 短视频自媒体涨粉的“小心机“,如何快速涨粉

    今天要分享的也是大家最关心 最头疼的问题 如何让自己的自媒体账号涨粉 关于涨粉 以下是你必须要知道的 01坚持发垂直作品 运营抖音账号 保证持续更新是十分必要的 另外内容选题上要保证足够垂直 每期做一个内容 一方面有利于塑造个人 IP 另一
  • 本科的控制工程到底学什么?

    一 控制学什么 对于控制领域来讲 我所研究的对象主要有两个 信号和系统 信号是信息的表现形式 目前所接触的信号主要就是电信号 即电压或电流等 而系统则是将一种信号处理成另一种信号的实体 在自动控制原理这门课中学到了各种的系统 也就是由一些电
  • win7下使用cpan安装Perl模块

    使用Padre集成开发环境 需要安装Perl模块 例如要安装IO promot模块 步骤如下 在cmd窗口中 使用命令 perl MCPAN e shell install IO Prompt 稍等一下就好了 安装完毕 但是也会遇到安装失败
  • ubuntu22.04 安装配置 Samba服务详细过程(新)

    1 先进入root目录 sudo s 2 安装Samba服务 apt get install samba 2 安装cifs utils包 cifs utils是一个Linux命令包 它提供了访问远程Windows网络共享的工具和命令 执行
  • Flutter windows程序窗口布满工作区

    Flutter 改变Windows窗口大小有一个比较多的插件 很多都是在main dart中注入 这样势必影响多平台应用 至少 我们也应该遵守单一职责原理 既然是windows的问题 那么就在windows中进行解决 通过阅读Flutter
  • 剑指 Offer 42. 连续子数组的最大和(java+python)

    输入一个整型数组 数组中的一个或连续多个整数组成一个子数组 求所有子数组的和的最大值 要求时间复杂度为O n 示例1 输入 nums 2 1 3 4 1 2 1 5 4 输出 6 解释 连续子数组 4 1 2 1 的和最大 为 6 提示 1
  • 从Java到Go:使用Go语言实现电子邮件发送服务

    目录 1 概述 2 SMTP简介 3 从Java到Go 基本语法差异 3 1 变量声明和初始化 3 2 函数声明
  • 微服务后端部署

    部署分布式微服务 本篇文章教会你从零部署spring cloud微服务的项目 部署 这是一个已经开发完成的spring cloud的项目 对服务进行打包 可以直接在总的项目下 通过maven对项目进行打包 这样系统就会帮助你对各个微服务进行
  • ESP8266单片机MicroPython保姆级把玩笔记

    一 MicroPython 环境搭建 1 所需工具 1 Thonny 一个简单的Python开发IDE 下载地址 https thonny org 百度网盘下载 4 0 2版本 链接 https pan baidu com s 1XmKOQ
  • tiktok跨境网络专线:解决TikTok访问卡顿问题,提升用户粘性

    TikTok是当前非常受欢迎的社交娱乐应用程序 拥有海量用户 然而 由于用户数量庞大 网络压力也随之增加 这可能导致用户在使用TikTok时出现访问卡顿的问题 为了解决这个问题 TikTok专线应运而生 TikTok专线是一种网络加速方案
  • 2022年4月第十三届蓝桥杯C/C++程序设计A组(省赛)试题及题解

    目录 试题A 裁纸刀 试题B 灭鼠先锋 试题C 求和 试题 D 选数异或 试题 E 爬树的甲壳虫 试题 F 青蛙过河 试题 G 最长不下降子序列 试题 H 扫描游戏 试题 I 数的拆分 试题 J 推导部分和 试题A 裁纸刀 答案为 n m